维基百科是否使用不同的方法来计算图像路径的哈希部分?

问题描述 投票:0回答:3

我正在使用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

有什么想法为什么哈希方案有时不起作用?

wikipedia
3个回答
1
投票

OQ 在 MediaWiki API 邮件列表上对您的问题的回复似乎是正确的:

val md5 = (new BigInteger(1, messageDigest)).toString(16)

当您将其转换为 BigInt 时,它会吃掉前导零。 不知道为什么,当 AFAIK MessageDigest 提供时提供了 toString 方法()


0
投票

总结一下:要计算维基百科图像的路径,您需要使用 org.apache.commons.codec.digest.DigestUtils#md5Hex:

String md5 = DigestUtils.md5Hex(image);
System.out.println(md5.substring(0, 1) + "/" + md5.substring(0, 2) + "/" + image);

0
投票

这是一个用 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>

© www.soinside.com 2019 - 2024. All rights reserved.