私はハッシング アルゴリズムとそれらを使用する際のリスクに精通していないため、以前の質問で受け取った以下の回答について質問があります。. .
ハッシュ値が ASCII にエンコードされた場合、16 個の ASCI 文字に収まる必要があるというコメントに基づいて、解決策は最初に、暗号化ハッシュ関数を選択することです (SHA-2 ファミリには SHA-256、SHA-384、および SHA-2 が含まれます)。 512) 次に、選択したハッシュ関数の出力を 96 ビット (12 バイト) に切り捨てます。つまり、ハッシュ関数の出力の最初の 12 バイトを保持し、残りのバイトを破棄してから、切り捨てられた出力を base-64 エンコードします。 16 個の ASCII 文字 (128 ビット) に変換し、実質的に 96 ビット強度の暗号化ハッシュを生成します。
base-64 でエンコードされた文字列を 16 文字にサブストリング化すると、それは根本的に異なり、ハッシュ関数の最初の 12 バイトを保持してから base-64 エンコードしますか? もしそうなら、誰かがバイト配列を切り捨てるために説明してください(サンプルコードを提供してください)?
完全なハッシュ値の部分文字列を 36,000 以上の異なる値に対してテストしたところ、衝突はありませんでした。以下のコードは私の現在の実装です。
あなたが提供できる助け(そして明確さ)に感謝します。
public static byte[] CreateSha256Hash(string data)
{
byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
SHA256 shaM = new SHA256Managed();
byte[] hashedData = shaM.ComputeHash(dataToHash);
return hashedData;
}
public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row)
{
byte[] hashedData = CreateSha256Hash(Row.HashString);
string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);
Row.HashValue = s.Substring(0, 16);
}
[元の投稿] (http://stackoverflow.com/questions/4340471/is-there-a-hash-algorithm-that-produces-a-hash-size-of-64-bits-in-c)