将字符串散列为c ++中的整数

时间:2013-04-18 05:39:33

标签: c++ string hash type-conversion

我试图弄清楚字符串到int的转换过程。我们正在使用散列来执行一个程序,其中要散列的键值是状态的名称。从我的研究来看,atoi()似乎不起作用。

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

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

5 个答案:

答案 0 :(得分:11)

C ++ 11在头文件std::hash中引入了一个名为<functional>的实现定义散列函数,该函数具有字符串类std::stringstd::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_tuint64_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;

}

测试:

enter image description here

答案 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)

如果字符串将保留在内存中,则某些库只返回字符串的地址作为哈希值。