0

Object.GetHashCode()が2つの同一のバイト配列に対して異なる値を返す理由がよくわかりませんが、IEnumerable値型でないオブジェクトに対しては等しい値を返します。例えば:

byte e = 123;
Console.WriteLine(e.GetHashCode());

byte f = 123;
Console.WriteLine(f.GetHashCode());

出力は

123
123

でもいつ

byte[] a = new byte[3] { 1, 2, 3 };
Console.WriteLine(a.GetHashCode());

byte[] b = new byte[3] { 1, 2, 3 };
Console.WriteLine(b.GetHashCode());

出力は

46104728
12289376

それはなぜですか? また、すべての要素を比較せずに、2 つの巨大な配列をすばやく比較するにはどうすればよいですか?

4

3 に答える 3

4

GetHashCode配列タイプには定義されていません-独自のハッシュアルゴリズムを実装する必要があります。

表示される値は実際には基になる参照に基づいているため、同じ参照でない限り、2つの同一の配列は常に異なるハッシュコードを持ちます。

32ビット以下の整数型の場合、ハッシュコードは32ビット整数に変換された値と等しくなります。64ビット積分タイプInt64の場合、ハッシュコードの上位32ビットは下位32ビットとXORされます(そこにもシフトがあります)。

したがって、2つのアレイを「すばやく」比較しようとする場合は、自分で行う必要があります。

最初にロジックチェックを使用できます-長さは等しく、同じバイト値で開始および終了します。次に、バイトごとに読み取るか、値を比較するかを選択できます(または、一度に4バイトまたは8バイトを読み取ることができます。を使用しBitConverterてバイトのブロックを変換するInt32か、等しいかどうかをチェックするのが速い可能性Int64のある単一の値のペアを作成するか、汎用ハッシュ関数を使用して等しいことを適切に推測します。

この目的のために、MD5ハッシュを使用できます-MD5でハッシュを出力するのは非常に迅速です:C#のバイト配列からハッシュコードを生成するにはどうすればよいですか?

このようなハッシュ関数から2つの同一のハッシュ値を取得しても、同等性が保証されるわけではありませんが、一般に、同じデータ「スペース」内のバイトの配列を比較する場合、衝突は発生しません。つまり、一般に、同じタイプの異なるデータの例では、ほとんどの場合、異なるハッシュが生成されるはずです。私が説明する資格があるよりも、これについてはネットの周りにもっとたくさんあります。

于 2012-10-09T08:50:34.527 に答える
1

SHA1CryptoServiceProvider.ComputeHash メソッドを使用してみてください。
バイト配列を取り、同一の SHA1 ハッシュを返します
バイト配列用。パフォーマンスは良好です。

文字列 byte1hash; 文字列 byte2hash;
使用 (SHA1CryptoServiceProvider sha1 = 新しい SHA1CryptoServiceProvider()) { byte1hash= Convert.ToBase64String(sha1.ComputeHash(byteArray1)); byte2hash= Convert.ToBase64String(sha1.ComputeHash(byteArray2));
} if (string.Equals(byte1hash, byte2hash)) { //バイト配列が同じであることを示します.. }

セキュリティが心配でない場合は、MD5 を選択します。

于 2012-12-18T11:10:03.473 に答える
0

参照型の場合、デフォルトでは、GetHashCodeは、オブジェクトのコンテンツからではなく、参照からハッシュコードを計算しています。

運が悪かったと思います。配列のハッシュコードを計算するには、少なくとも1回は配列の内容を調べる必要があります。

于 2012-10-09T08:49:54.793 に答える