3

コードにハッシュマップを実装したいので、murmurhash3に固執することにしました

私は現在、x86用にコンパイルされたプログラムのみを提供し、コードを一般的に保つように努めているため、x64でプログラムを実行する際に問題が発生したことはありません。

これで、murmurhashのヘッダーファイルを確認しました。ライブラリは次の機能を提供します。

MurmurHash3_x86_32
MurmurHash3_x86_64
MurmurHash3_x86_128

MurmurHash3_x64_32
MurmurHash3_x64_64 
MurmurHash3_x64_128 

これは、x64システムでこのハッシュライブラリを使用できるようにするには、x64関数を使用し、x64実行可能ファイルを提供する必要があることを意味しますか?または、単にx86バージョンを使用して、パフォーマンスが低下する可能性がありますか?

_32 _64 _128ビットバージョンは、より多くのビットバージョンがより良い分散を提供することを意味するだけだと私は考えていますか?

4

2 に答える 2

6

編集:murmurhash3のドキュメントを見た後、すべてを変更しました。

まず、_x86バリアントはポータブルハッシュアルゴリズムです。_32 / _64 / _128は、ハッシュの幅をビット単位で示します。通常、ハッシュアルゴリズムが2 32バケットよりも小さい限り、_32で問題ありません。

_x64バリアントは、まったく異なるハッシュアルゴリズムのファミリーです。_x64_128すべての_x64バリアントは、実装(128ビットハッシュ)に基づいています。次に、ハッシュの一部を破棄して、_32および_64ビットサイズを取得します。これは、_x86バリアントよりも高速である場合とそうでない場合があります。ただし、ドキュメントには、いくつかの印象的な高速化が記載されています。ただし、x86バリアントとは異なるハッシュ値を取得する可能性が非常に高いことに注意してください。

于 2011-02-19T10:59:07.110 に答える
1

x86は、アルゴリズムが32ビットプラットフォーム用に最適化されていることを示します。これは、32ビットの符号なし整数で動作することを意味します。

x64は、64ビットプラットフォーム用に最適化され、64ビットの符号なし整数で動作します。

また、2つの間の結果には互換性がありません。MurmurHash3_x86_128同じ入力のハッシュ値は、それがそうであるかどうかによって異なりますMurmurHash3_x64_128

これは、x64システムでこのハッシュライブラリを使用できるようにするには、x64関数を使用し、x64実行可能ファイルを提供する必要があることを意味しますか?または、単にx86バージョンを使用して、パフォーマンスが低下する可能性がありますか?

64ビットハッシュ関数は32ビットシステム用にコンパイルできますが、コンパイラが計算を2つの部分に分割するため、非常に遅くなります。32ビットのサポートが重要な場合は、x64に最適化された関数ではなく、x86に最適化された関数を使用する必要があります。x64システムでは、32ビットコードは正常に実行されますが、十分に活用されていないと思います。x64に最適化されたアルゴリズムは、64ビットCPUの場合にはるかに効率的です。

_32 _64 _128ビットバージョンは、より多くのビットバージョンがより良い分散を提供することを意味するだけだと私は考えていますか?

答えはイエスだと思います。分布とは、「衝突を引き起こす可能性が低い」という意味です。ハッシュで使用されるメモリの追加ビットごとに、考えられる結果の数が劇的に増加します。4ビットハッシュには16の可能なハッシュがあり、64は18 quintillionを提供します(128は340.2 undecillionを提供します!)。256ビットは非常に多くを提供するため、暗号化セキュリティの目的には十分であることがよくあります。


その他の注意事項:最近のハッシュ関数は、CRC32、AES、SSE2、SIMDなどのCPUの新しい命令セットを利用しています。この関数は特定のCPU機能/命令を利用して、サポートされているハードウェアでパフォーマンスを向上させます。これにより、これらの最新機能をサポートするCPUでのハッシュを大幅に高速化できます。

于 2018-04-16T14:24:28.357 に答える