LoginSignup
41
30

More than 5 years have passed since last update.

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

Posted at

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 オブジェクトを引数として渡せるようになる。

41
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
30