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

use*_*706 7 c++ string hash type-conversion

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

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

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

Rap*_*ptz 12

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
}
Run Code Online (Sandbox Code Playgroud)

专门std::hash针对用户定义的类型也不是很复杂.但请注意,没有std::hash专业化const char*或任何C字符串.


joh*_*ohn 5

您需要一个散列函数将您的字符串转换为或多或少的任意整数。有很多可供选择,是的,它们通常使用字符串的 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Jay*_*llo 5

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

}
Run Code Online (Sandbox Code Playgroud)

测试:

在此处输入图片说明