9

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

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

我很迷茫,所以任何信息都会很棒。谢谢!

4

5 回答 5

19

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*

于 2013-04-18T05:56:46.677 回答
6

您需要一个哈希函数来将您的字符串转换为或多或少的任意整数。有很多可供选择,是的,它们通常使用字符串的 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;
}

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

于 2013-04-18T05:48:29.810 回答
6

这里开始,有两个函数可以将字符串转换为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;

}

测试:

在此处输入图像描述

于 2018-07-11T03:12:52.860 回答
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
    }
}
于 2013-04-18T05:43:55.430 回答
0

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

于 2013-04-18T06:29:42.373 回答