短文件名的最佳字符串哈希函数

时间:2012-07-10 13:00:34

标签: c++ string hash

对于像字符串这样的文件名,最好的字符串哈希函数是什么? 字符串类似于:

pics/test.pic
maps/test.map
materials/metal.mtl

3 个答案:

答案 0 :(得分:10)

如果要散列的数据的性质不需要任何花哨的散列算法,例如文本字符串的性质,您可能需要尝试FNV hashing function。为了纪念创作者,FnV哈希是Fowler / Noll / Vo的缩写,是一种非常快速的算法,已经在许多应用程序中使用,结果非常好,并且为了简单起见,FNV哈希应该是第一个尝试的哈希之一申请。

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 algorithm代替,这是通用的,因此可以很好地满足您的需求。

答案 1 :(得分:0)

没有普遍的“最佳”散列函数,与散列的使用方式无关。

假设你想要一个32位的int,以便在内存中使用一个小的哈希表。

然后您可以使用FNV-1a algorithm

hash = offset_basis
for each octet_of_data to be hashed
 hash = hash xor octet_of_data
 hash = hash * FNV_prime
return hash

如果您的目的是确信两条路径提供不同的哈希值,那么您可以使用SHA1 algorithm

如果您想确定恶意创建冲突很困难,那么您可以使用SHA256

请注意,最后一个算法生成长哈希值(比典型路径长)。

答案 2 :(得分:0)

只需使用std::hash<std::string>即可。这是您的库实现者对“最佳”通用非加密哈希函数的想法。