适用于短文件名的最佳字符串哈希函数
Best string hashing function for short filenames
对于类似文件名的字符串,什么是最好的字符串哈希函数?字符串类似于:
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>
。这就是库实现者对"最佳"通用非加密散列函数的想法。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 我的求解(字符串 a、字符串 b)的输出与随机哈希中的预期输出不匹配
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 在 cpp 自己的版本中对字符串进行哈希处理
- 哈希字符串更改大小写
- 以字符串向量作为值的哈希映射
- 字符串单词的唯一哈希值
- 用于对编译时字符串进行哈希处理的延迟指针
- 如何生成伪随机 32 字节字符串以用作加密哈希函数中的盐?
- 在哈希表中调整字符串数组的大小
- C 字符串哈希散列字符串或内存地址吗?
- 有关忽略字符顺序的字符串哈希函数的建议
- 适用于短文件名的最佳字符串哈希函数
- 此示例的最佳字符串哈希函数
- 使用异或和位移位的字符串哈希算法
- 在哈希表中创建字符串哈希值的时间复杂度
- 在C++中真正编译时字符串哈希