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

发布于 2024-12-19 12:54:37 字数 781 浏览 3 评论 0原文

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

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

I'm using dbpedia's extraction_framework(ImageExtractor#getImageUrl) to
get the url of an image(the md5 of the first two chars)

   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

Most of the time, the function works correctly but on a few cases, it
is incorrect:

For "Stewie_Griffin.png", I get 2/26/Stewie_Griffin.png but the real
one is 0/02/Stewie_Griffin.png

The source file info is here:
http://en.wikipedia.org/wiki/File:Stewie_Griffin.png
http://upload.wikimedia.org/wikipedia/en/0/02/Stewie_Griffin.png

Any ideas why the hashing scheme doesn't work sometimes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

云仙小弟 2024-12-26 12:54:37

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

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

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

OQ's response to your question on the MediaWiki API mailing list seems to be right:

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

It's eating the leading zero when you're converting it to a BigInt.
Not sure why, when AFAIK MessageDigest provides provides a toString method()

我恋#小黄人 2024-12-26 12:54:37

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

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

Just to summarize: to compute a path to Wikipedia image you need to use org.apache.commons.codec.digest.DigestUtils#md5Hex:

String md5 = DigestUtils.md5Hex(image);
System.out.println(md5.substring(0, 1) + "/" + md5.substring(0, 2) + "/" + image);
屋顶上的小猫咪 2024-12-26 12:54:37

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

Here is an implementation, in JavaScript, for retrieving the absolute path of image files.

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>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文