我希望能够根据散列字符串为用户创建唯一的令牌*。我知道我可以,例如,使用md5()库,但由于目的不是加密,我想知道是否有任何我可以“开箱即用”的东西。原生JavaScript中是否有可用的单向散列函数?
*我意识到这些并不是严格独特的。我很可能有很小的哈希碰撞机会。
答案 0 :(得分:15)
答案 1 :(得分:7)
JavaScript没有本机哈希,但有很多库。
我建议使用 crypto-js :https://code.google.com/p/crypto-js/
例如,要使用SHA1,您只需:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha1.js"></script>
<script>
var hash = CryptoJS.SHA1("Message");
</script>
答案 2 :(得分:6)
本机JavaScript中没有任何内容可用。您可以使用Murmurhash之类的内容。这里有一个JavaScript实现:https://github.com/garycourt/murmurhash-js。我没有使用它,所以不能担保它。
更新:现在JavaScript中有多个Murmurhash3实现。但是,与参考C ++实现相比,它们中的许多都存在将字符串编码为字节的问题,并且可能产生不同的结果。您可以read an analysis on this here,murmurhash3js-revisited库实现函数的所有三种变体并符合引用。
答案 3 :(得分:4)
目前实验性的Web Crypto API
可能会出现这种情况https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto
当然,在撰写本文时,在生产环境中使用是不切实际的,并且很可能是一个移动的目标。但是,5年谁知道?
答案 4 :(得分:2)
2020年,将有一个本机API:
SubtleCrypto.digest()
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
示例:
crypto.subtle
.digest("SHA-256", new TextEncoder().encode("hello"))
.then(console.log);
十六进制字符串转换:
const digest = async ({ algorithm = "SHA-256", message }) =>
Array.prototype.map
.call(
new Uint8Array(
await crypto.subtle.digest(algorithm, new TextEncoder().encode(message))
),
(x) => ("0" + x.toString(16)).slice(-2)
)
.join("");
digest({message: "hello"}).then(console.log)