web-dev-qa-db-ja.com

任意の文字列に基づいて整数を生成します(GetHashCodeなし)

任意の文字列に基づいて整数を生成するメソッドを作成しようとしています。 2つの同一の文字列でこのメソッドを呼び出す場合、両方の時間で同じ正確な整数を生成するメソッドが必要です。

.GetHasCode()を使用してみましたが、プロジェクトを別のマシンに移動すると、GetHasCode()が同じ文字列に対して異なる値を返すため、これは非常に信頼性が低くなります。

衝突率が非常に低いことも重要です。私がこれまでに書いたカスタムメソッドは、わずか数十万のレコードの後に​​衝突を引き起こします。

ハッシュ値は整数でなければなりません。文字列ハッシュ値(md5など)は、速度と読み込みのオーバーヘッドの点でプロジェクトを不自由にします。

整数ハッシュは、非常に高速なテキスト検索を実行するために使用されています。これは私が美しく機能していますが、現在は.GetHasCode()に依存しており、複数のマシンが関与する場合は機能しません。

どんな洞察も大歓迎です。

12
mrb398

MD5ハッシュは、整数に変換できるバイト配列を返します。

var mystring = "abcd";
MD5 md5Hasher = MD5.Create();
var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(mystring));
var ivalue = BitConverter.ToInt32(hashed, 0);

もちろん、128ビットのハッシュから32ビットのintに変換しているため、一部の情報が失われ、衝突の可能性が高くなります。 2番目のパラメーターをToInt32に調整して、MD5ハッシュの特定の範囲がデータの他の範囲よりも衝突が少ないかどうかを確認できます。

17
Rudism

ハッシュコードが「数十万レコード後に」重複を作成する場合は、かなり優れたハッシュコードの実装があります。

計算を行う の場合、32ビットハッシュコードは、約70,000レコードの後に​​重複を作成する可能性が50%あることがわかります。 100万件のレコードの後に​​重複が生成される可能性は、問題にならないほど確実に近いものです。

経験則として、ハッシュされたレコードの数が可能な値の数の平方根に等しい場合、重複するハッシュコードが生成される可能性は50%です。したがって、2 ^ 32の可能な値を持つ32ビットのハッシュコードでは、約2 ^ 16(65,536)の値の後に重複が生成される可能性は50%です。 actualの数値はわずかに大きく、70,000に近いですが、経験則により、球場に入ることができます。

もう1つの経験則では、ハッシュされるアイテムの数が平方根の4倍の場合、重複が生成される可能性はほぼ100%です。したがって、32ビットのハッシュコードを使用すると、2 ^ 18(262,144)レコードだけがハッシュされた後に衝突が発生することがほぼ保証されます。

MD5を使用して128ビットから32ビットに変換しても、これは変わりません。

8
Jim Mischel

このコードは、任意の文字列を0〜100の整数にマップします

int x= "ALi".ToCharArray().Sum(x => x)%100;
0
Roohi Ali