原生JavaScript中是否有任何单向散列函数?

bul*_*ley 40 javascript hash

我希望能够基于散列字符串为用户创建唯一的令牌*.我知道我可以,例如,使用md5()库,但由于目的不是加密,我想知道是否有任何我可以"开箱即用"的东西.原生JavaScript中是否有任何单向散列函数?

*我意识到这些并不是严格独特的.我很可能有很小的哈希碰撞机会.

Kae*_*ens 15

不是我知道的.

但是,您始终可以使用MD5的JavaScript实现

http://pajhome.org.uk/crypt/md5/

  • MD5很好.花60秒阅读它并适当地使用它. (14认同)

Ter*_*emi 9

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>
Run Code Online (Sandbox Code Playgroud)


Jia*_*ang 7

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);
Run Code Online (Sandbox Code Playgroud)

十六进制字符串转换:

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)
Run Code Online (Sandbox Code Playgroud)

  • 但是,SubtleCrypto API 需要启用 TLS 的网站。是否存在缺少此约束的选项? (2认同)

Tim*_*own 6

本机JavaScript中没有任何内容可用.你可以使用像Murmurhash这样的东西.这里有一个JavaScript实现:https://github.com/garycourt/murmurhash-js.我没有使用它,所以不能保证它.

更新:现在JavaScript中有多个Murmurhash3实现.但是,与参考C++实现相比,它们中的许多都存在将字符串编码为字节的问题,并且可能产生不同的结果.你可以在这里阅读对此的分析,murmurhash3js重新访问的库实现了函数的所有三个变体并符合引用.


Ada*_*ant 5

在不久的将来,这可能通过当前实验性的 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年后谁知道呢?