文字列がどの言語を使用していても(Java、vb.net ...)、どのようなオペレーティングシステムであっても、文字列が常に同じ方法でハッシュされることを保証できますか?
ハッシュ関数は deterministic です。同じ入力は同じ出力を生成します。特定のハッシュ関数の実装は、それが実装されている言語に関係なく、同じように動作する必要があります。
ただし、ハッシュ関数はビットのシーケンスを入力として取ることに注意してください。 「文字列をハッシュする」とき、実際には一連の文字を一連のビットに変換してからハッシュします。トラブルが始まります。文字列"café"
について考えてみます。可能なビットへのすべての変換の中で、次のすべてが一般的です。
63 61 66 e9 ISO-8859-1 ("latin-1")
63 61 66 ca a9 UTF-8
63 61 66 65 cc 81 UTF-8 (NFD)
ef bb bf 63 61 66 ca a9 UTF-8 (with BOM)
ef bb bf 63 61 66 65 cc 81 UTF-8 (NFD with BOM)
63 00 61 00 66 00 e9 00 UTF-16 little-endian
00 63 00 61 00 66 00 e9 UTF-16 big-endian
ff fe 63 00 61 00 66 00 e9 00 UTF-16 little-endian (with BOM)
fe ff 00 63 00 61 00 66 00 e9 UTF-16 big-endian (with BOM)
63 00 61 00 66 00 65 00 01 03 UTF-16 little-endian (NFD)
00 63 00 61 00 66 00 65 03 01 UTF-16 big-endian (NFD)
ff fe 63 00 61 00 66 00 65 00 01 03 UTF-16 little-endian (NFD with BOM)
fe ff 00 63 00 61 00 66 00 65 03 01 UTF-16 big-endian (NFD with BOM)
与えられたハッシュ関数で処理すると、すべてが非常に異なるハッシュ値を生成します。暗号化関数を扱うときは、何をするかについて非常に正確でなければなりません。すべてのビットが重要です。
どういう意味かよくわかりませんが、そうです。正しく記述されたハッシュ関数の出力は、言語に関係なく同じでなければなりません。
異なるプログラミング言語ライブラリのハッシュと異なるプラットフォームでのハッシュの唯一の違いは速度です。適切に書かれたライブラリでは-違いはささいなことでしょう。
はい、正確に同じ「バイトシーケンス」は、実装に関係なく常に正確な同じダイジェスト値を生成します(正しい実装であると仮定します!)
重要なのは、これは「バイトシーケンス」には常に当てはまることですが、あなたが書いた「ストリング」には必ずしも当てはまりません。多くの事柄に応じて、文字列はシステムごとに異なる方法で生成できます。多くの空白または行末の違い、またはASCIIとUnicode UTF-16エンコードの問題の可能性があります。
また、ダイジェスト値を表示すると、同様の問題が発生することに注意してください。実装によっては、大文字または小文字のいずれかの値で16進数を表す場合があるため、文字列の等価性テストが失敗する可能性があります。
塩を使用していない場合は、常に同じです。塩を使用している場合は、塩を変更すると異なります。