我试图弄清楚字符串到整数的转换过程。我们正在做一个带有散列的程序,其中要散列的键值是一个状态的名称。根据我的研究,似乎 atoi() 不起作用。
我需要分解单词的每个字母并单独转换吗?我使用 ASCII 吗?我是否完全走错了方向?
我很迷茫,所以任何信息都会很棒。谢谢!
我试图弄清楚字符串到整数的转换过程。我们正在做一个带有散列的程序,其中要散列的键值是一个状态的名称。根据我的研究,似乎 atoi() 不起作用。
我需要分解单词的每个字母并单独转换吗?我使用 ASCII 吗?我是否完全走错了方向?
我很迷茫,所以任何信息都会很棒。谢谢!
C++11 引入了一个std::hash
在 header<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
针对您的用户定义类型也不是很复杂。但是请注意,没有任何 C 字符串的std::hash
专门化。const char*
您需要一个哈希函数来将您的字符串转换为或多或少的任意整数。有很多可供选择,是的,它们通常使用字符串的 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;
}
请不要认为这是一个很好的哈希函数,这是一个完全不同的话题。
从 这里开始,有两个函数可以将字符串转换为uint32_t
or 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;
}
测试:
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
}
}
如果字符串将留在内存中,一些库只是将字符串的地址作为哈希返回。