4

adler32 チェックサム アルゴリズムを使用して、データベース ID から数値を生成しています。したがって、データベースに行を挿入するときは、その行の ID を取得し、それを使用してチェックサムを作成します。私が直面している問題は、データベースに 207 回挿入しただけで繰り返しチェックサムを生成したことです。これは、私が予想していたよりもはるかに高速です。これが私のコードです:

String dbIdStr = Long.toString(dbId);
byte[] bytes = dbIdStr.getBytes();
Checksum checksum = new Adler32();
checksum.update(bytes, 0, bytes.length);
result = checksum.getValue();

私がしていること/方法に何か問題がありますか? 一意の文字列を作成するために別の方法を使用する必要がありますか? URL で db id を使用したくないため、これを行っています... db の構造を変更すると、世界中のすべてのリンクが壊れます。

ありがとう!

4

2 に答える 2

13

Adler-32 をハッシュ コード ジェネレータとして使用しないでください。それはそのためではありません。優れたハッシュ プロパティを持つアルゴリズムを使用する必要があります。これにより、特に衝突の可能性が最小限に抑えられます。

Java のhashCodeメソッドを (任意のオブジェクトで) 単純に使用できます。String オブジェクトの場合、ハッシュ コードは、文字列のバイト値に連続する 31 のべき乗を掛けた値の合計です。非常に短い文字列では衝突が発生する可能性がありますが、これは恐ろしいアルゴリズムではありません。ハッシュ アルゴリズムとしては、Adler-32 よりもはるかに優れています。

暗号的に安全なハッシュ関数 (SHA-256 など) を使用するという提案は、実行時間とハッシュ コード サイズの両方の点で、アプリケーションにとって確かに過剰です。Java の hashCode を試して、衝突が何回発生するかを確認してください。2 -nの確率 ( nはハッシュ コードのビット数) で予想されるよりもはるかに頻繁に発生する場合は、より適切な確率でオーバーライドできます。まともな Java ハッシュ関数のリンクはこちらにあります。

于 2012-07-22T06:54:35.347 に答える
0

SHA-256 のような安全なハッシュ関数を試してみてください。2 進数で等しくないデータの競合が見つかった場合は、銀行口座に 1000 ドルが支払われます。SHA-2 がクラックされ、故意に衝突が発生した場合、オファーは終了します。つまり、出力は 32 ビットではなく 32 バイトです。

于 2012-07-22T15:13:13.193 に答える