Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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

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_Hashcode - Fatal编程技术网

C++ 小字符串散列函数

C++ 小字符串散列函数,c++,string,hash,hashcode,C++,String,Hash,Hashcode,我有一个从长度1到长度5的字符串,需要以良好的性能和最小的冲突对其进行散列。有什么建议吗?(我不需要安全性)你有linux吗?试试/bin/gperf它可以从密钥集生成一个完美的哈希函数。根据您的场景,您可能需要某种类型的哈希。但是,如果您只需要一些东西来分隔它们,那么std::hash() 另一种选择是: long long hash(const std::string &val) { long long hash = 0; memcpy(reinterpret_cas

我有一个从长度1到长度5的字符串,需要以良好的性能和最小的冲突对其进行散列。有什么建议吗?(我不需要安全性)

你有linux吗?试试
/bin/gperf
它可以从密钥集生成一个完美的哈希函数。

根据您的场景,您可能需要某种类型的哈希。但是,如果您只需要一些东西来分隔它们,那么
std::hash()

另一种选择是:

long long hash(const std::string &val) {
    long long hash = 0;
    memcpy(reinterpret_cast<char*>(&hash), val.c_str(), std::min(sizeof(hash), val.length());
    return hash;
}
long-long散列(常量std::string&val){
长散列=0;
memcpy(reinterpret_cast(&hash),val.c_str(),std::min(sizeof(hash),val.length());
返回散列;
}
对于上面代码中的任何错误类型,我深表歉意,因为它没有被编译或测试。这有最小的冲突(无),我猜性能相当好,质量也不太好。所谓质量,我指的是相邻值的分离和整个键空间的使用


当然,还有一系列常规加密哈希函数可供选择,但我从您的问题中得出结论,这些函数不是您的目标。

数字有多大?它是ansi还是unicode字符串?哈希应该有多长?回答时需要更多信息。如果字符串集在编译时已知,参见Paul Evan的答案。否则,所有“主流”散列函数都会表现相当好(或同样糟糕)对于如此短的字符串。我会使用乘加散列,如djb2或sdbm,因为它们简单、快速,并且只有3行代码。如果预期的输入字符串通常只有32位或更少,我不会使用诸如MurrueHash或cityhash之类的东西来处理32位或64位字,而是让一个字节对一个字节的散列重复几次。你会如果可以将字符串放入哈希大小中,则ght甚至不需要进行哈希运算,也不需要模糊原始字符串。哈希长度需要随着输入而增长,我正计划使用无序映射,让STL来处理。