4

次のプロパティを持ついくつかの単純なおよび/またはよく知られているハッシュメソッドがあるかどうかについて、私は興味があります:

  1. 32 ビット int を別の 32 ビット int に変換します。
  2. 2 つの等しくない入力が同じ出力を生成することはありません
  3. 出力を見ただけでは、2 つの入力が (違いとビットマスクに関して) 類似していることはすぐにはわかりません。つまり、hash(a) と hash(a+1) の出力は、hash(a ) およびハッシュ (a & 0x100000)。(これにより、ランダムな値を使用した単純な XOR が除外されます。)

そのようなシステムは理論的には明らかに存在するはずですが、実際には存在するのでしょうか?

4

5 に答える 5

2

簡単な解決策は、ビット順序変更配列を作成することです。一部の暗号化関数は、この方法に基づいています。

uint8_t arr[32]={4,7,24,9,15,3,...}; // an order you know
uint32_t orgVal;
uint32_t modVal =0;
uint32_t pos = 1;

for (int i=0; i<32;i++) {
  modVal += (orgVal&pos)? (1>>arr[i]):0;
  pos*=2;
}

(コードはゼロから作成され、IDE またはテストなしで作成されました。動作しない可能性があります)

コメントで指摘されているように、ビットを見ると、違いは最小限になります。0 と 1 の量は同じになります。この問題を解決するには、ビット順序変更と xor の両方を使用することを検討してください。その場合、元の値と結果の値の差はさらに大きくなります。

于 2013-05-06T12:43:19.183 に答える