从长字符串制作短散列
Make short hash from long string
我有一个很长的字符串,我需要一个唯一的 ID 来缓存它。
id 不需要反转,但是相等的字符串需要 return 相等的 id。
例如:
- 这是一个很长的字符串 -> SFG2527G
- 这是其他东西 -> JSNTFK2783
- 这是一个很长的字符串 -> SFG2527G
我不需要反转哈希。
使用 Javascript 实现此目标的最佳方法是什么?
散列越短,冲突的可能性就越高。
然而,在 Java 世界中,有一个字符串 hashCode
帮助器 returns 一个“not如此独特" 字符串中的整数,这是将字符串映射为 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,但它 kinda 总是按预期工作,并且它是 explained in MDN.
P.S。 NodeJS 15+ 有一个与 Web 相同的 crypto.webcrypto
命名空间,因此您可以在浏览器和服务器中使用相同的代码。
我有一个很长的字符串,我需要一个唯一的 ID 来缓存它。 id 不需要反转,但是相等的字符串需要 return 相等的 id。
例如:
- 这是一个很长的字符串 -> SFG2527G
- 这是其他东西 -> JSNTFK2783
- 这是一个很长的字符串 -> SFG2527G
我不需要反转哈希。
使用 Javascript 实现此目标的最佳方法是什么?
散列越短,冲突的可能性就越高。
然而,在 Java 世界中,有一个字符串 hashCode
帮助器 returns 一个“not如此独特" 字符串中的整数,这是将字符串映射为 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,但它 kinda 总是按预期工作,并且它是 explained in MDN.
P.S。 NodeJS 15+ 有一个与 Web 相同的 crypto.webcrypto
命名空间,因此您可以在浏览器和服务器中使用相同的代码。