我试图弄清楚字符串到int的转换过程。我们正在使用散列来执行一个程序,其中要散列的键值是状态的名称。从我的研究来看,atoi()似乎不起作用。
我是否需要打破单词的每个字母并单独转换?我使用ASCII吗?我完全走向了错误的方向吗?
我非常迷失,所以任何信息都会非常棒。谢谢!
答案 0 :(得分:11)
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
}
为用户定义的类型专门设置std::hash
也不是很复杂。请注意,std::hash
或任何C字符串没有const char*
专门化。
答案 1 :(得分:3)
您需要哈希函数才能将字符串转换为或多或少的任意整数。有很多可供选择,是的,他们通常使用字符串的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;
}
请不要将此作为良好哈希函数的建议,这是一个完全不同的主题。
答案 2 :(得分:3)
从here开始,有两个函数可以将字符串转换为uint32_t
或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;
}
测试:
答案 3 :(得分:0)
boost::lexical_cast可能符合您的需求。
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
std::string str = "123456";
try
{
int i = boost::lexical_cast<int>(str);
// i should be 123456 here
}
catch(const boost::bad_lexical_cast&)
{
//bad format
}
}
答案 4 :(得分:0)
如果字符串将保留在内存中,则某些库只返回字符串的地址作为哈希值。