2

数字の順列に依存しない整数に対して、必ずしも固定長ではなく、一意のハッシュを生成するためのアルゴリズムが必要です。

同様に、123、321、312、213...のハッシュは同じである必要があります。(先行ゼロは無視してください)

私が試したのは、すべての桁をそれ自体に上げて合計することでした。好き、

Hash(321) = 3**3 + 2**2 + 1**1

さて、それが衝突を引き起こすかどうかはわかりませんし、確かに、多数のパフォーマンスの問題があります。代替案はありますか?

4

3 に答える 3

5

1つのオプション:数字を並べ替えます。123、321、312、および213はすべて123に移動します。

別のオプション:各桁のカウントのベクトルをハッシュとして使用します。123、321、312、および213はすべて[0,1,1,1,0,0,0,0,0,0]に移動します。

于 2012-04-28T20:33:30.477 に答える
1

必要なのは、ハッシュ関数(md5を使用してみましょう)と、物事を相互に結合する方法だけです。各桁のハッシュを取得し、可換法でそれらを結合します。たとえば、md5と加算を選択した場合、各桁をmd5して、結果のハッシュを追加できます。代わりにsha1と乗算を使用することを選択した場合、異なる結果が得られますが、それでも必要なプロパティがあります。衝突の問題はもっと難しいです...

于 2012-04-28T20:33:11.507 に答える
0

アルゴリズムとしてクロスサムを使用するだけです

于 2012-04-28T20:33:23.550 に答える