Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 短文件名的最佳字符串哈希函数_C++_String_Hash - Fatal编程技术网

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

C++ 短文件名的最佳字符串哈希函数,c++,string,hash,C++,String,Hash,对于类似文件名的字符串,最好的字符串哈希函数是什么? 字符串类似于: pics/test.pic maps/test.map materials/metal.mtl 如果要散列的数据的性质不需要任何花哨的散列算法,比如文本字符串的性质,那么您可能需要尝试。FNV散列是Fowler/Noll/Vo的缩写,是一种非常快速的算法,已在许多应用程序中使用,并取得了很好的效果。为了简单起见,FNV散列应该是应用程序中尝试的第一批散列之一 unsigned int fnv_hash (void* key,

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

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

如果要散列的数据的性质不需要任何花哨的散列算法,比如文本字符串的性质,那么您可能需要尝试。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;
}
无符号整数fnv_散列(void*键,整数len)
{
无符号字符*p=键;
无符号整数h=2166136261;
int i;
对于(i=0;i
或者使用通用的哈希函数,这样就可以很好地满足您的需求。

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

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

然后,您可以使用:

如果您的目的是确信两条路径给出不同的散列,那么您可以使用

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


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

只需使用
std::hash
。这是您的库实现人员关于“最佳”通用非加密哈希函数的想法。

哈希的目的是什么?没有一个通用的“最佳”散列函数独立于散列的使用方式。STL有一个内置的字符串散列函数:加密散列很可能是多余的。OP可以在c++11中使用boost::hash或std::hash。是否过度杀戮?你知道如何使用这个散列以及为什么使用它吗?是的,我做加密研究,所以我对加密散列非常熟悉。SHA1比最慢的非加密散列还要慢一个数量级,所以他会牺牲速度来进行他最可能不需要的抗冲突假设。如果OP只是想构建一个哈希表,那么FNV就足够好了,它是许多小型库(带有变体)中的功能。我评论说,我们必须知道目的。如果没有目的,尝试选择一种算法是有点徒劳的。@DeadMG为什么哈希函数只针对文本进行专门化,而本质上它可以处理任何类型的数据,并且可以重用为任何其他用途,而不针对每种用途调整实现?@DeadMG讽刺的是,就在你给出我的答案a-1之前,我在这里对你的答案进行了升级,在这之前,你的答案通常是-1票。+1抵消-1,因为空格*允许它处理任何数据,而不仅仅是字符串。虽然const void*const键更好。
hash = offset_basis
for each octet_of_data to be hashed
 hash = hash xor octet_of_data
 hash = hash * FNV_prime
return hash