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