C++ 将字符串散列为c++;

C++ 将字符串散列为c++;,c++,string,hash,type-conversion,C++,String,Hash,Type Conversion,我试图找出字符串到整数的转换过程。我们正在做一个散列程序,其中要散列的键值是一个状态的名称。根据我的研究,似乎atoi()不起作用 我是否需要将单词的每个字母分解并单独转换?我使用ASCII码吗?我完全走错方向了吗 我非常迷路,所以任何信息都会非常棒。谢谢 可能适合您的需要 #include <string> #include <boost/lexical_cast.hpp> int main() { std::string str = "123456";

我试图找出字符串到整数的转换过程。我们正在做一个散列程序,其中要散列的键值是一个状态的名称。根据我的研究,似乎atoi()不起作用

我是否需要将单词的每个字母分解并单独转换?我使用ASCII码吗?我完全走错方向了吗

我非常迷路,所以任何信息都会非常棒。谢谢

可能适合您的需要

#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
    }
}
#包括
#包括
int main()
{
std::string str=“123456”;
尝试
{
inti=boost::词法转换(str);
//我应该是123456
}
catch(const boost::bad_lexical_cast&)
{
//格式错误
}
}
您需要一个哈希函数来将字符串转换成或多或少的任意整数。有很多可供选择,是的,它们通常使用字符串的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;
}
无符号长哈希(const std::string&str)
{
无符号长散列=5381;
对于(大小i=0;i

请不要认为这是一个好的哈希函数,这是一个完全不同的主题。

C++11在header
中引入了一个名为
std::hash
的实现定义的哈希函数,该函数专门用于字符串类
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
}
#包括
#include//for std::hash
#包括
int main(){
std::string str=“Hello World”;
散列哈希器;
auto hashed=hasher(str);//返回std::size\u t

std::cout如果字符串将保留在内存中,一些库只返回字符串的地址作为散列。

从中,有两个函数将字符串转换为
uint32\u t
uint64\u t
,转换为
uint32\u 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;

}
inline uint32\u t hash\u str\u uint32(const std::string&str){
uint32_t hash=0x811c9dc5;
uint32_t素数=0x1000193;
对于(int i=0;i
测试:


您可以实现类似于java.lang.String的函数。
std::hash(您的std\u字符串)
?:p♥ C++11我不认为OP要求将一个数字字符串转换为整数。是的,我需要将一个单词,如“阿拉斯加”或“伊利诺伊”转换为整数,这样我就可以对它进行哈希运算。@user2109706:将一个(非数字)字符串转换为整数的过程就是对它进行哈希运算。如果我试图转换的字符串是一个州名,比如“阿拉斯加”,我能这样做吗或者“Illinois”?@user2109706是的,这个函数将把任何字符串转换成散列码。重要的一点是,“Alaska”和“Illinois”将被转换成不同的散列码(我希望如此)。啊,我明白了。谢谢你John,我会尝试一下。