我正在使用dbpedia的extraction_framework(ImageExtractor#getImageUrl)来 获取图片的url(前两个字符的md5)
val md = MessageDigest.getInstance("MD5")
val messageDigest = md.digest(fileName.getBytes)
val md5 = (new BigInteger(1, messageDigest)).toString(16)
val hash1 = md5.substring(0, 1)
val hash2 = md5.substring(0, 2);
val urlPart = hash1 + "/" + hash2 + "/" + fileName
大多数情况下,该功能可以正常工作,但在少数情况下,它会 不正确:
对于“Stewie_Griffin.png”,我得到 2/26/Stewie_Griffin.png 但真正的 一个是 0/02/Stewie_Griffin.png
源文件信息在这里: http://en.wikipedia.org/wiki/File:Stewie_Griffin.png http://upload.wikimedia.org/wikipedia/en/0/02/Stewie_Griffin.png
有什么想法为什么哈希方案有时不起作用?
OQ 在 MediaWiki API 邮件列表上对您的问题的回复似乎是正确的:
val md5 = (new BigInteger(1, messageDigest)).toString(16)
当您将其转换为 BigInt 时,它会吃掉前导零。 不知道为什么,当 AFAIK MessageDigest 提供时提供了 toString 方法()
总结一下:要计算维基百科图像的路径,您需要使用 org.apache.commons.codec.digest.DigestUtils#md5Hex:
String md5 = DigestUtils.md5Hex(image);
System.out.println(md5.substring(0, 1) + "/" + md5.substring(0, 2) + "/" + image);
这是一个用 JavaScript 实现的,用于检索图像文件的绝对路径。
const imgGroups = [
// Dots
['MJt1-.svg', 'MJt2-.svg', 'MJt3-.svg', 'MJt4-.svg', 'MJt5-.svg', 'MJt6-.svg', 'MJt7-.svg', 'MJt8-.svg', 'MJt9-.svg'],
// Bamboo
['MJs1-.svg', 'MJs2-.svg', 'MJs3-.svg', 'MJs4-.svg', 'MJs5-.svg', 'MJs6-.svg', 'MJs7-.svg', 'MJs8-.svg', 'MJs9-.svg'],
// Characters
['MJw1-.svg', 'MJw2-.svg', 'MJw3-.svg', 'MJw4-.svg', 'MJw5-.svg', 'MJw6-.svg', 'MJw7-.svg', 'MJw8-.svg', 'MJw9-.svg'],
// Honors
['MJf1-.svg', 'MJf2-.svg', 'MJf3-.svg', 'MJf4-.svg', 'MJd1-.svg', 'MJd2-.svg', 'MJd3-.svg'],
// Bonus
['MJh5-.svg', 'MJh6-.svg', 'MJh7-.svg', 'MJh8-.svg', 'MJh1-.svg', 'MJh2-.svg', 'MJh3-.svg', 'MJh4-.svg']
];
const BASE_URL = 'https://upload.wikimedia.org/wikipedia/commons';
const getAbsolutePath = (filename, baseUrl = BASE_URL) => {
const hash = CryptoJS.MD5(filename.replace(/ /g, '_')).toString();
return `${baseUrl}/${hash[0]}/${hash.substring(0, 2)}/${filename}`;
};
const groups = imgGroups.map(group =>
group.map(filename => getAbsolutePath(filename)));
for (let group of groups) {
for (let absolutePath of group) {
const img = new Image();
img.src = absolutePath;
img.width = 32;
document.body.append(img);
}
document.body.append(document.createElement('br'));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/core.min.js" integrity="sha512-t8vdA86yKUE154D1VlNn78JbDkjv3HxdK/0MJDMBUXUjshuzRgET0ERp/0MAgYS+8YD9YmFwnz6+FWLz1gRZaw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/md5.min.js" integrity="sha512-3sGbaDyhjGb+yxqvJKi/gl5zL4J7P5Yh4GXzq+E9puzlmVkIctjf4yP6LfijOUvtoBI3p9pLKia9crHsgYDTUQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>