【问题标题】:Make short hash from long string [duplicate]从长字符串制作短哈希[重复]
【发布时间】:2021-04-25 16:40:12
【问题描述】:

我有一个很长的字符串,我需要一个唯一的 ID 来缓存它。 id 不需要反转,但是相等的字符串需要返回相等的 id。

例如:

  • 这是一个非常长的字符串 -> SFG2527G
  • 这是别的东西 -> JSNTFK2783
  • 这是一个非常长的字符串 -> SFG2527G

我不需要反转哈希。

用 Javascript 实现这一目标的最佳方法是什么?

【问题讨论】:

  • 我不明白这个问题。您所描述的基本上是哈希的作用,所以既然您已经用cryptojs 标记了您的问题,只需选择一个哈希算法(例如 SHA-1)并使用它。请记住:哈希值越短,冲突的风险就越高。
  • 是的,这似乎可行:const long_string = 'hey there'const hash = require('crypto').createHash('sha256').update(long_string, 'utf8').digest('hex');
  • 我认为哈希总是比字符串长。然而事实并非如此。我尝试了一个很长的字符串,它仍然相当短。
  • 太棒了。随时将其发布在答案中,我会接受。谢谢。

标签: javascript node.js encryption hash cryptojs


【解决方案1】:

哈希值越短,冲突的可能性就越高。

然而,在 Java 世界中,有一个字符串 hashCode 帮助器从字符串中返回一个“not so unique”整数,它是最小的将字符串映射为 ID 的方法,但它不保证唯一性并且它会发生冲突

因此,我强烈不鼓励您在野外使用它,但为了回答起见,在这里您可以如何使用这种哈希:

function hashCode(s) {
  for (var h = 0, i = 0; i < s.length; h &= h)
    h = 31 * h + s.charCodeAt(i++);
  return h;
}

另一方面,sha256 是一种“不会发生冲突”的单向哈希(它会发生,但比 MD5、SHA1 或hashCode 在那里),所以虽然结果是一个更长的唯一 ID,但它有点被授予始终按预期工作,它是 explained in MDN

附: NodeJS 15+ 有一个与 Web 相同的 crypto.webcrypto 命名空间,因此您可以在浏览器和服务器中使用相同的代码。

【讨论】:

  • 它在引号中,因为它确实会遭受冲突,就像每个产生有限字符集的单向哈希一样,但它在现实世界中极为罕见,并且考虑比 MD5 或 SHA1 更健壮,但它比 SHA-512 具有更好的性能,后者也会遭受冲突。他们都这样做。与遭受更多冲突的 Java 哈希相比,SHA-256 是一个足够安全且快速的赌注。
  • 把它放在双引号中意味着你应该带着一点盐。是的,确实会发生碰撞,但可能性极小。 2^256 约为 1.158 * 10^77。这是很多可能的值,因此可以散列很多可能的输入而不会发生冲突。
  • P.S.我已经编辑了答案,这样我们就可以继续我们的一天了。
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2018-05-26
  • 2023-03-15
  • 2017-12-15
  • 2011-03-19
  • 2020-11-18
相关资源
最近更新 更多