0

64ビット整数のみをハッシュしたい。私はここで与えられたmurmurhash3の実装を使用しています。この制約が与えられた場合、コードにいくつかの改善がありますか?完全には理解できませんが、171行目のforループがターゲットになっているのではないかと思います。これについて何か提案してください。

4

1 に答える 1

2

64ビットの数値のみをハッシュする必要がある場合は、数値を使用します。すべてのmurmur3が行うのは、同じ入力番号を同じ出力番号に混合するCPUサイクルを浪費することです。唯一の例外は、シードを変更する場合です。

本当に固定サイズに最適化したい場合は、関数をコピーして、わずかに変更することができます(コンパイラーが定数の伝播と定数の畳み込みを行うことで、手間のかかる作業を行うことができます)。

void MurmurHash3_x86_128_uint64 ( const void * key, uint32_t seed, void * out)
{
  const int len = sizeof(uint64_t); 
  //now len is a compile time constant, and can be folded when this
  //function is not inlined (else it would just be a constant input,
  //which could only be folded when the function is inlined)
  const uint8_t * data = (const uint8_t*)key;
  const int nblocks = len / 16;

後の段階でC++を使用している場合は、次のようにこれをテンプレートに変換するのが理にかなっています。

template<const size_t len>
void MurmurHash3_x86_128_uint64 ( const void * key, uint32_t seed, void * out)
{
  const uint8_t * data = (const uint8_t*)key;
  const int nblocks = len / 16;

また、一部のよりスマートなコンパイラ(ICC、MSVC、GCC)は、関数が同じ定数引数(部分的に定数の引数リストを含む)でのみ呼び出されたかどうかを検出し、それらの定数を関数にフォールドすることに注意してください(これには「プログラム全体の最適化が必要です」 "有効にするオプション)

于 2012-06-15T07:16:26.470 に答える