前にゲームシステムを作ったときに、セーブデータの互換が失われるという現象にはまったことがあり、今回その面で調べてみようと思いサンプルを組んでハッシュコードのテストをしているときに見つけた間違いでした。
ちなみに、SHA系のアルゴリズムの元となる説明はFIPS 180という文章の中に記述されていますのでそれを参考にしてください。実行結果(演算の途中結果)もありますので。
で、これのサンプルを使ってハッシュコードをとっていたのですが、SHA-1の動きは正しかったのですが、SHA-256とSHA-512の結果がおかしいことに気がつかされて組み間違いが発覚。
定数系はただのコピーだし、演算もほぼコピーしているはずなのに・・・と思いながらアルゴリズムを眺めていたら・・・
・・・ビット回転の方向が逆だった・・・
(SHA-1では左回転で定義されているのにSHA-256とSHA-512では右回転だった・・・)
という間抜けなミスに気がついてその部分を修正すると正しい演算結果が得られたので一安心。
ちなみに、VisualStudioの場合はビット回転処理はライブラリ関数として用意されているのでそっちを使うとより安心。
定義は文章の中にも書いてありますが、ライブラリ関数の方はうまくいけばCPUの命令に直接展開されるので微妙な速度UPに。
こういう系のコードはちゃんと仕様書を読んだ方が間違いが少ないという例でした。
なお、政治系の話はここではしないことにしています。いろいろと思うことはあるのですが、そっち系で話をするとおそらく泥沼にはまるだけだと思いますので・・・。
基本的に私の考えは「できるだけ中立に」物事を考えるようにしています。(どちらも正しい面があり、どちらも間違っている面があるというスタンスが基本)