sha256sumを書いてみた

Wikipedia に sha256 の疑似コード載ってるじゃん1ってことで sha256sum を書いてみた。

sha256.c

あと出力されたバイト列見てもどこが間違ってるのか分からないので割と苦労した。

一応気づきとしては、coreutils に入ってる sha256sum コマンドは 相当速くて、かなり頑張ってチューニングしたんだろうなと思った。

どのくらい速いかというと、疑似コード真似しただけのコードだと 1 GiB のファイルの ハッシュに 40 秒強かかるところを、coreutils のそれだと 500 ms くらいで終わる。 coreutils 速いのは知ってるけどここまで歴然とした差があるとかなりびっくりする。

一応 coreutils の sha256sum は gnulib から引っ張ってきてるっぽいので そこへのリンクを。

http://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/sha256.c?id=591f00666450e5e70514d457846af2c8d301af9b

FIXME: see sha1.c for a better implementation.

とか言っててよく意味が分からん。これでも best ではないらしい。

チラッと見た感じだと Wikipedia にも載ってるように maj と ch (だったか忘れたけど) の求め方工夫して計算量減らすやつは当然のようにやってるっぽいなーとか マクロ部分見てて思ったんだけど嘘言ってるかも (Wikipedia も sha1 の記事に 投げてあるのでそっちすら雰囲気しか見てないけど)。 にしてもそんなに速くなるかなぁ……。