use*_*706 7 c++ string hash type-conversion
我试图弄清楚字符串到int的转换过程.我们正在使用散列来执行一个程序,其中要散列的键值是状态的名称.从我的研究来看,似乎atoi()不会起作用.
我是否需要打破单词的每个字母并单独转换?我使用ASCII吗?我完全走错了方向吗?
我很迷茫,所以任何信息都会很棒.谢谢!
Rap*_*ptz 12
C++ 11引入称为实现定义的散列函数std::hash在报头<functional>,其具有特殊的字符串类别std::string,std::wstring等.
它就像这样简单:
#include <iostream>
#include <functional> //for std::hash
#include <string>
int main() {
std::string str = "Hello World";
std::hash<std::string> hasher;
auto hashed = hasher(str); //returns std::size_t
std::cout << hashed << '\n'; //outputs 2146989006636459346 on my machine
}
Run Code Online (Sandbox Code Playgroud)
专门std::hash针对用户定义的类型也不是很复杂.但请注意,没有std::hash专业化const char*或任何C字符串.
您需要一个散列函数将您的字符串转换为或多或少的任意整数。有很多可供选择,是的,它们通常使用字符串的 ASCII 值。这是一个叫做 djb2
unsigned long hash(const std::string& str)
{
unsigned long hash = 5381;
for (size_t i = 0; i < str.size(); ++i)
hash = 33 * hash + (unsigned char)str[i];
return hash;
}
Run Code Online (Sandbox Code Playgroud)
请不要认为这是一个很好的哈希函数,这是一个完全不同的主题。
从 这里开始,有两个函数可以将字符串转换为uint32_tor uint64_t,转换为uint32_t:
inline uint32_t hash_str_uint32(const std::string& str) {
uint32_t hash = 0x811c9dc5;
uint32_t prime = 0x1000193;
for(int i = 0; i < str.size(); ++i) {
uint8_t value = str[i];
hash = hash ^ value;
hash *= prime;
}
return hash;
}
Run Code Online (Sandbox Code Playgroud)
测试: