JavaScript
md5
WebAssembly
SHA-1
xxHash

javascriptのハッシュライブラリを比較する

javascriptのハッシュライブラリを比較する

概要

javascript向けのハッシュライブラリの性能が気になり調査した。

調べたライブラリは以下

調査方法

ハッシュアルゴリズムは

  • xxHash
  • SHA-1
  • SHA-256
  • MD5

のみを対象とする。

入力データとしては

  • 文字列(String)
  • ファイルデータ(ArrayBuffer,未対応ならバイナリ文字列)

調査対象ブラウザは、Windows7 の Firefox63, Google Chrome70, IE11。
ただし、IE11はWebAssemblyが未サポートなので xxhash-wasm, bitcoin-ts は動作しない

各ライブラリの特徴と準備

ライブラリによっては、入力が文字列限定であったり、ファイルの読み込み(ArrayBuffer)に対応しておらず独自形式でないといけなかったりする。
ライブラリ毎に入力形式を工夫し、場合によっては一部改変した。

  • xxhash-wasm: 対応している入力が文字列のみであったので、ArrayBufferにも対応出来るよう改造した
  • cybozulabs/sha1: 対応しているのはバイナリ文字列のみ(charCodeAt(i)の返値がuint8を想定)なのでArrayBuffer対応した改造版を作成し cybozulabs/sha1(AB) とした
  • crypto-js/sha1,sha256,md5: 入力が文字列かCryptoJS独自のWordArrayオブジェクトなので、ArrayBufferをWordArrayへ変換する処理を追加した。また、省メモリ化のためAraryBufferを何回かに分けてWordArrayに変換する方式を追加し crypto-js/sha1(AB) として別に計測した。
  • forge/sha1: 入力が文字列のみなので、ArrayBufferをバイナリ文字列に変換する処理を追加した
  • bitcoin-ts/sha1,sha256: 配布されているjsファイルがそのままでは動作しなかったためwebpackでbundle.jsを作成している

特に xxhash-wasm のArrayBuffer対応は効果が大きかったので最後に参考として載せておく

調査結果まとめ

実験結果の詳細は長くなるので末尾に列挙した。
かなりざっくりまとめると、

  • xxhash-wasm がダントツで早い(Firefoxで他の10倍以上、Chromeは1.9倍以上)
  • WebAssembly や asm.js を利用してないライブラリの中では js-xxhash が早く、次点で emn178/sha1, emn178/sha256 が良いか

アルゴリズム別には

  • xxHashに限ると、予想どおり xxhash-wasmjs-xxhash となる
  • SHA-1に限ると、入力が文字列なら emn178/sha1, rusha が早く、ファイルなら WebAssembly実装の bitcoin-ts が早く、次いで emn178/sha1, rusha が良いか
  • SHA-256は、入力が文字列なら emn178/sha256 が早い。ファイルなら bitncoin-ts/sha256 が早くなる
  • MD5は、文字列なら emn178/md5forge/md5、ファイルなら emn178/md5 が早い

ブラウザ別に見ると

  • Firefox は WebAssembly や asm.js の効果が大きいように感じる
  • Chrome も Firefox ほどではないが WebAssembly, asm.js が効果的
  • ただ、Chrome の場合は asm.js 対応してない('use asm'表記がない) コードでも最適化がかかって早くなる場合があるようだ
  • IE11 は全体的にかなり遅く、素直にアルゴリズムの違いだけが効いているように見える(xxHashが早く,MD5,SHA-1,SHA-256と続く)

実験結果詳細1 - 文字列データの場合

入力する文字列データは、短いもの(約20KB)と長いもの(約400KB)の2種類を用意した。
ブラウザ別に実験し以下の結果になった。

Firefox small text

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm f05b7932 0 -
xxhash-wasm(64b) f8b7fe989ec9325 0.1 193.30
emn178/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 1.4 13.80
emn178/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 1.8 10.73
forge/md5 4c1b17b77cf1722c5d0b356d11e8abcb 1.8 10.73
forge/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 2 9.66
forge/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 2.1 9.20
crypto-js/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 2.3 8.40
crypto-js/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 2.3 8.40
bitcoin-ts/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 2.7 7.15
crypto-js/md5 4c1b17b77cf1722c5d0b356d11e8abcb 2.8 6.90
bitcoin-ts/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 2.8 6.90
js-xxhash f05b7932 2.9 6.66
sjcl/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 3.3 5.85
sjcl/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 3.9 4.95
js-xxhash(64b) f8b7fe9809ec9325 4.1 4.71
cybozulabs/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 5.1 3.79
rusha 7d1206ee3a4995913de8857a962e48e970e2333e 6.4 3.02
emn178/md5 4c1b17b77cf1722c5d0b356d11e8abcb 7.1 2.72
cybozulabs/md5 4c1b17b77cf1722c5d0b356d11e8abcb 10.1 1.91

Firefox large text

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm(64b) dfc791976d97d7d1 1.33 313.43
xxhash-wasm 7afefb09 1.66 250.74
emn178/sha1 4d92b1fb281d8438c2156aa7a92bdb7a89857137 12 34.82
rusha 543e7997382a1c77fdd12d9801c49dab66c74ed5 17 24.58
emn178/sha256 0cd37dd229068c9d9a848b8cc8d2cc6cbb41db6008a2a4da0c2c4d60a62804be 17.33 24.11
js-xxhash 7afefb09 19.33 21.61
forge/md5 da467abe0c39983a2c232142ec6768bd 21.66 19.28
forge/sha1 4d92b1fb281d8438c2156aa7a92bdb7a89857137 25.66 16.28
forge/sha256 0cd37dd229068c9d9a848b8cc8d2cc6cbb41db6008a2a4da0c2c4d60a62804be 28 14.92
crypto-js/sha1 4d92b1fb281d8438c2156aa7a92bdb7a89857137 29.33 14.24
crypto-js/md5 da467abe0c39983a2c232142ec6768bd 29.33 14.24
crypto-js/sha256 0cd37dd229068c9d9a848b8cc8d2cc6cbb41db6008a2a4da0c2c4d60a62804be 30.66 13.62
emn178/md5 da467abe0c39983a2c232142ec6768bd 32.33 12.92
js-xxhash(64b) dfc791976d97d7d1 42.66 9.79
bitcoin-ts/sha1 4d92b1fb281d8438c2156aa7a92bdb7a89857137 48.66 8.58
bitcoin-ts/sha256 0cd37dd229068c9d9a848b8cc8d2cc6cbb41db6008a2a4da0c2c4d60a62804be 48.66 8.58
sjcl/sha1 4d92b1fb281d8438c2156aa7a92bdb7a89857137 53.66 7.78
cybozulabs/sha1 4d92b1fb281d8438c2156aa7a92bdb7a89857137 78.33 5.33
sjcl/sha256 0cd37dd229068c9d9a848b8cc8d2cc6cbb41db6008a2a4da0c2c4d60a62804be 84.66 4.93
cybozulabs/md5 da467abe0c39983a2c232142ec6768bd 123.33 3.38

Google Chrome small text

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm(64b) f8b7fe989ec9325 0.20 96.65
xxhash-wasm f05b7932 0.25 74.34
bitcoin-ts/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 0.89 21.47
bitcoin-ts/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 1.01 18.95
rusha 7d1206ee3a4995913de8857a962e48e970e2333e 1.60 12.00
crypto-js/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 1.85 10.39
sjcl/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 2.04 9.47
emn178/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 2.39 8.08
sjcl/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 2.53 7.61
emn178/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 2.57 7.49
js-xxhash f05b7932 2.68 7.18
forge/md5 4c1b17b77cf1722c5d0b356d11e8abcb 2.79 6.90
forge/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 2.86 6.73
crypto-js/md5 4c1b17b77cf1722c5d0b356d11e8abcb 3.25 5.94
emn178/md5 4c1b17b77cf1722c5d0b356d11e8abcb 3.49 5.52
crypto-js/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 3.74 5.16
forge/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 3.90 4.95
cybozulabs/md5 4c1b17b77cf1722c5d0b356d11e8abcb 4.52 4.27
cybozulabs/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 5.28 3.66
js-xxhash(64b) f8b7fe9809ec9325 5.62 3.43

Google Chrome large text

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm eca4534b 4.30 96.96
xxhash-wasm(64b) a914651cee9e302a 4.33 96.29
rusha 55eebdc91a5cddfd3cbeca9046519d06fbf9fccd 7.76 53.85
emn178/md5 1ad061d3f2e1ae832d694d726959fe7c 9.53 43.80
emn178/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 14.70 28.42
emn178/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 16.25 25.70
forge/md5 1ad061d3f2e1ae832d694d726959fe7c 21.57 19.36
forge/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 21.91 19.07
js-xxhash eca4534b 22.20 18.81
forge/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 23.68 17.64
crypto-js/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 28.57 14.62
bitcoin-ts/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 28.64 14.58
bitcoin-ts/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 29.07 14.37
cybozulabs/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 30.04 13.91
crypto-js/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 30.09 13.88
sjcl/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 30.93 13.51
sjcl/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 31.06 13.45
cybozulabs/md5 1ad061d3f2e1ae832d694d726959fe7c 31.07 13.45
crypto-js/md5 1ad061d3f2e1ae832d694d726959fe7c 33.90 12.32
js-xxhash(64b) a914651cee9e302a 68.68 6.08

IE11 small text

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
js-xxhash f05b7932 3.72 5.19
emn178/md5 4c1b17b77cf1722c5d0b356d11e8abcb 4.05 4.76
emn178/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 4.65 4.14
cybozulabs/md5 4c1b17b77cf1722c5d0b356d11e8abcb 5.33 3.62
emn178/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 5.41 3.57
forge/md5 4c1b17b77cf1722c5d0b356d11e8abcb 5.45 3.54
rusha 7d1206ee3a4995913de8857a962e48e970e2333e 5.69 3.39
forge/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 6.45 2.99
crypto-js/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 6.59 2.93
crypto-js/md5 4c1b17b77cf1722c5d0b356d11e8abcb 6.73 2.87
js-xxhash(64b) f8b7fe9809ec9325 7.78 2.48
cybozulabs/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 7.99 2.41
sjcl/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 8.58 2.25
forge/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 9.03 2.14
sjcl/sha256 6288860b7dbf8f30809ab39fc0739dad583356f42096b9fa204a4091920bd5c3 9.82 1.96
crypto-js/sha1 94ad35fcd68600626afa83d2778c867cb2dac8a6 14.76 1.30

IE11 large text

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
js-xxhash eca4534b 38.85 10.75
emn178/md5 1ad061d3f2e1ae832d694d726959fe7c 39.79 10.50
emn178/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 55.51 7.52
emn178/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 80.77 5.17
cybozulabs/md5 1ad061d3f2e1ae832d694d726959fe7c 82.55 5.06
rusha 55eebdc91a5cddfd3cbeca9046519d06fbf9fccd 84.26 4.95
cybozulabs/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 102.55 4.07
crypto-js/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 103.46 4.03
forge/md5 1ad061d3f2e1ae832d694d726959fe7c 105.80 3.94
crypto-js/md5 1ad061d3f2e1ae832d694d726959fe7c 110.58 3.77
forge/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 112.60 3.71
crypto-js/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 133.32 3.13
forge/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 149.48 2.79
js-xxhash(64b) a914651cee9e302a 151.64 2.75
sjcl/sha256 bb65dcfe9f9d63ff4d4e322257c3e281a3a0227435b242cc082145ebcc6c859d 174.77 2.39
sjcl/sha1 0a18490021f260c8eea9ddb0d9a91f176ca655f9 193.45 2.16

実験結果詳細2 - ファイルデータの場合

ファイルデータも2種類、約1MBのものと約50MBのものを用意した。
これもブラウザ毎に検証した。

Firefox small file

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm 46414a05 1 1072.46
xxhash-wasm(64b) ff0b0c9fd8e4844 1 1072.46
bitcoin-ts/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 12 89.37
bitcoin-ts/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 16 67.02
emn178/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 32 33.51
rusha 4a7fae7142387b7c72d92271d491ee8e7ac62177 35 30.64
js-xxhash 46414a05 40 26.81
crypto-js/md5(AB) b12c69e74ea938b432916c7d4b9523a3 41 26.15
crypto-js/sha1(AB) 4a7fae7142387b7c72d92271d491ee8e7ac62177 42 25.53
crypto-js/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 43 24.94
crypto-js/md5 b12c69e74ea938b432916c7d4b9523a3 47 22.81
crypto-js/sha256(AB) 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 48 22.34
emn178/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 48 22.34
crypto-js/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 49 21.88
cybozulabs/sha1(AB) 4a7fae7142387b7c72d92271d491ee8e7ac62177 70 15.32
emn178/md5 b12c69e74ea938b432916c7d4b9523a3 90 11.91
sjcl/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 107 10.02
js-xxhash(64b) ff0b0c9fd8e4844 123 8.71
forge/md5 b12c69e74ea938b432916c7d4b9523a3 138 7.77
forge/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 148 7.24
forge/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 154 6.96
cybozulabs/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 187 5.73
cybozulabs/md5 b12c69e74ea938b432916c7d4b9523a3 320 3.35
sjcl/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 1028 1.04

Firefox large file

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm(64b) 4407011eb470e572 28 1677.72
xxhash-wasm c7f44ffa 29 1619.87
emn178/md5 61d52ad7a06a226c0c65121fc92b3f8a 445 105.56
bitcoin-ts/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 511 91.93
js-xxhash c7f44ffa 601 78.16
bitcoin-ts/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 630 74.56
rusha 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 935 50.24
emn178/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 1110 42.32
emn178/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 1634 28.74
crypto-js/md5(AB) 61d52ad7a06a226c0c65121fc92b3f8a 1669 28.14
crypto-js/md5 61d52ad7a06a226c0c65121fc92b3f8a 1786 26.30
crypto-js/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 1913 24.55
crypto-js/sha256(AB) 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 1969 23.85
crypto-js/sha1(AB) 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 2077 22.61
crypto-js/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 2315 20.29
cybozulabs/sha1(AB) 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 2472 19.00
js-xxhash(64b) 4407011eb470e572 4354 10.78
sjcl/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 4468 10.51
forge/md5 61d52ad7a06a226c0c65121fc92b3f8a 5879 7.99
cybozulabs/md5 61d52ad7a06a226c0c65121fc92b3f8a 5927 7.92
forge/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 5990 7.84
forge/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 6532 7.19
cybozulabs/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 7458 6.29
sjcl/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 43857 1.07

Google Chrome small file

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm(64b) ff0b0c9fd8e4844 0.59 1787.44
xxhash-wasm 46414a05 1.10 974.97
bitcoin-ts/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 20.99 51.06
bitcoin-ts/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 22.30 48.09
rusha 4a7fae7142387b7c72d92271d491ee8e7ac62177 22.89 46.83
js-xxhash 46414a05 34.89 30.72
emn178/md5 b12c69e74ea938b432916c7d4b9523a3 35.29 30.38
emn178/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 41.80 25.65
emn178/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 44.69 23.99
crypto-js/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 54.70 19.60
sjcl/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 56.59 18.94
sjcl/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 60.69 17.66
cybozulabs/sha1(AB) 4a7fae7142387b7c72d92271d491ee8e7ac62177 61.60 17.41
crypto-js/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 64.99 16.49
crypto-js/sha256(AB) 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 71.90 14.91
crypto-js/md5(AB) b12c69e74ea938b432916c7d4b9523a3 83.99 12.76
crypto-js/md5 b12c69e74ea938b432916c7d4b9523a3 84.29 12.72
crypto-js/sha1(AB) 4a7fae7142387b7c72d92271d491ee8e7ac62177 91.40 11.73
js-xxhash(64b) ff0b0c9fd8e4844 180.10 5.95
forge/md5 b12c69e74ea938b432916c7d4b9523a3 302.60 3.54
forge/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 309.40 3.46
forge/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 313.29 3.42
cybozulabs/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 336.20 3.18
cybozulabs/md5 b12c69e74ea938b432916c7d4b9523a3 339.19 3.16

Google Chrome large file

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
xxhash-wasm c7f44ffa 41.99 1118.48
xxhash-wasm(64b) 4407011eb470e572 93.79 500.81
cybozulabs/sha1(AB) 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 343.80 136.63
emn178/md5 61d52ad7a06a226c0c65121fc92b3f8a 376.59 124.73
js-xxhash c7f44ffa 397.69 118.12
rusha 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 636.20 73.83
bitcoin-ts/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 938.99 50.02
bitcoin-ts/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 1071.89 43.82
emn178/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 1073.30 43.76
emn178/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 1552.29 30.26
crypto-js/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 1872.59 25.08
sjcl/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 1935.79 24.26
crypto-js/sha1(AB) 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 2013.69 23.32
crypto-js/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 2036.70 23.06
crypto-js/sha256(AB) 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 2144.49 21.90
crypto-js/md5 61d52ad7a06a226c0c65121fc92b3f8a 2217.30 21.18
crypto-js/md5(AB) 61d52ad7a06a226c0c65121fc92b3f8a 2225.70 21.10
sjcl/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 4466.49 10.51
js-xxhash(64b) 4407011eb470e572 4864.89 9.65
cybozulabs/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 12226.80 3.84
forge/md5 61d52ad7a06a226c0c65121fc92b3f8a 12279.40 3.82
cybozulabs/md5 61d52ad7a06a226c0c65121fc92b3f8a 12406.39 3.78
forge/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 12446.89 3.77
forge/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 12615.49 3.72

IE11 small file

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
js-xxhash 46414a05 361.79 2.96
emn178/md5 b12c69e74ea938b432916c7d4b9523a3 850.19 1.26
cybozulabs/md5 b12c69e74ea938b432916c7d4b9523a3 877.59 1.22
js-xxhash(64b) ff0b0c9fd8e4844 1088.59 0.98
forge/md5 b12c69e74ea938b432916c7d4b9523a3 1120.30 0.95
crypto-js/md5(AB) b12c69e74ea938b432916c7d4b9523a3 1137.00 0.94
crypto-js/md5 b12c69e74ea938b432916c7d4b9523a3 1159.29 0.92
cybozulabs/sha1(AB) 4a7fae7142387b7c72d92271d491ee8e7ac62177 1392.29 0.77
cybozulabs/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 1537.50 0.69
emn178/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 1599.99 0.67
crypto-js/sha1(AB) 4a7fae7142387b7c72d92271d491ee8e7ac62177 1624.90 0.66
crypto-js/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 1657.09 0.64
forge/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 1683.39 0.63
sjcl/sha1 4a7fae7142387b7c72d92271d491ee8e7ac62177 2108.50 0.50
rusha 4a7fae7142387b7c72d92271d491ee8e7ac62177 2473.19 0.43
sjcl/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 2561.60 0.41
emn178/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 2752.19 0.38
crypto-js/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 2799.20 0.38
crypto-js/sha256(AB) 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 2815.80 0.38
forge/sha256 3693c5eae807139a7d25744aa46fda52e342081426213c8172c0aa428eefabaa 2879.90 0.37

IE11 large file

Hash方法 計算結果(hex) 平均処理時間(msec) 効率(MB/s)
js-xxhash c7f44ffa 14574.69 3.22
emn178/md5 61d52ad7a06a226c0c65121fc92b3f8a 36746.40 1.27
cybozulabs/md5 61d52ad7a06a226c0c65121fc92b3f8a 38677.59 1.21
forge/md5 61d52ad7a06a226c0c65121fc92b3f8a 40836.70 1.15
crypto-js/md5(AB) 61d52ad7a06a226c0c65121fc92b3f8a 43548.40 1.07
js-xxhash(64b) 4407011eb470e572 45746.10 1.02
crypto-js/md5 61d52ad7a06a226c0c65121fc92b3f8a 48135.69 0.97
cybozulabs/sha1(AB) 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 61327.30 0.76
rusha 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 64682.59 0.72
crypto-js/sha1(AB) 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 66047.49 0.71
cybozulabs/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 66253.00 0.70
forge/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 66877.60 0.70
crypto-js/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 67165.09 0.69
emn178/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 69002.79 0.68
sjcl/sha1 4c8a902c2f6c387ae1a9841e4cfb1094abf2010b 95946.60 0.48
crypto-js/sha256(AB) 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 116144.70 0.40
sjcl/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 116869.60 0.40
emn178/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 119427.89 0.39
forge/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 122898.69 0.38
crypto-js/sha256 317e4f1eaf6185cd7d27e8c60b745f52b463f611fc2a23a148d3b61337be2f6e 124765.89 0.37

改造箇所

xxhash-wasm (xxhash-wasm-0.3.1)

xxhash-wasm/src/index.js 27行目,35行目付近

入力の strencoder.encode(str) でエンコードしてしまっているので
String型じゃないときはスルーするようにしている。

--- xxhash-wasm-0.3.1/src/index.js.original
+++ xxhash-wasm-0.3.1/src/index.js
@@ -27 +27 @@ async function xxhash() {
-      const strBuffer = encoder.encode(str);
+      const strBuffer = typeof str === 'string' ? encoder.encode(str) : str;
@@ -35 +35 @@ async function xxhash() {
-      const strBuffer = encoder.encode(str);
+      const strBuffer = typeof str === 'string' ? encoder.encode(str) : str;

こうしておけば

xxhash().then(function(hasher) {
  console.log(hasher.h32(new Uint8Array([97, 98, 99])));
});

のようにして Uint8Array オブジェクトを引数として渡せるようになる。