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

Best string hashing function for short filenames

本文关键字:字符串 哈希 函数 最佳 文件名 适用于      更新时间:2023-10-16

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

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

如果要散列的数据的性质不需要任何花哨的散列算法,比如文本字符串的性质,那么您可能需要尝试FNV散列函数。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算法,它是通用的,因此可以很好地满足您的需求。

没有一个独立于哈希使用方式的通用"最佳"哈希函数。

假设您想要一个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

如果你的目的是确信两条路径给出不同的哈希,那么你可以使用SHA1算法。

如果你想确保恶意创建碰撞非常困难,那么你可以使用SHA256。

请注意,最后两个算法会生成长散列(比您的典型路径长)。

只需使用std::hash<std::string>。这就是库实现者对"最佳"通用非加密散列函数的想法。