文字列のようなファイル名に最適な文字列ハッシュ関数は何でしょうか?文字列は次のようになります。
pics/test.pic
maps/test.map
materials/metal.mtl
ハッシュされるデータの性質が、テキスト文字列の性質のように、凝ったハッシュアルゴリズムを必要としない場合は、FNVハッシュ関数を試してみることをお勧めします。作成者に敬意を表してFowler/Noll / Voの略であるFNVハッシュは、多くのアプリケーションで素晴らしい結果をもたらす非常に高速なアルゴリズムであり、その単純さのために、FNVハッシュは最初に試されたハッシュの1つである必要がありますアプリケーション。
unsigned int fnv_hash (void* key, int len)
{
unsigned char* p = key;
unsigned int h = 2166136261;
int i;
for (i = 0; i < len; i++)
h = (h*16777619) ^ p[i];
return h;
}
または、代わりにMD5アルゴリズムを使用してロールします。これは汎用であるため、ニーズを十分にカバーします。
ハッシュの使用方法に関係なく、普遍的に「最良の」ハッシュ関数はありません。
メモリ内の小さなハッシュテーブルを使用するために、32ビットのintが必要だとします。
次に、 FNV-1aアルゴリズムを使用できます。
hash = offset_basis
for each octet_of_data to be hashed
hash = hash xor octet_of_data
hash = hash * FNV_prime
return hash
2つのパスが異なるハッシュを提供するという事実に自信を持つことが目的の場合は、SHA1アルゴリズムを使用できます。
悪意を持って衝突を作成することが非常に難しいことを確認したい場合は、SHA256を使用できます。
これらの最後の2つのアルゴリズムは、長いハッシュ(通常のパスよりも長い)を生成することに注意してください。
を使用するだけstd::hash<std::string>
です。これは、「最良の」汎用の非暗号化ハッシュ関数に関するライブラリ実装者の考えです。