如何在C++中获取字符串的哈希代码

如何在C++中获取字符串的哈希代码,c++,string,hash,hashcode,C++,String,Hash,Hashcode,下面的java代码返回字符串的哈希代码 String uri = "Some URI" public int hashCode() { return uri.hashCode(); } 我想把这个代码翻译成C++。在C++中是否有可用的函数,或者是一种简单的翻译方法。p> 在C++03中,boost::hash。在C++11中,std::hash 就我个人而言,我喜欢使用boost的散列函数 制作字符串哈希非常简单 boost::hash<std::string> stri

下面的java代码返回字符串的哈希代码

String uri = "Some URI"
public int hashCode() {
    return uri.hashCode();
}
我想把这个代码翻译成C++。在C++中是否有可用的函数,或者是一种简单的翻译方法。p> 在C++03中,boost::hash。在C++11中,std::hash


就我个人而言,我喜欢使用boost的散列函数

制作字符串哈希非常简单

boost::hash<std::string> string_hash;

std::size_t h = string_hash("Hash me");

新版本的C++与STD::HASH

< P> Boost提供了散列函数:


以下是爪哇中默认Struth.HasCo码的来源,这是在C++中实现的一个琐碎的练习。

public int hashCode()  
{
       int h = hash;
       if (h == 0 && count > 0) 
       {
           int off = offset;
           char val[] = value;
           int len = count;

           for (int i = 0; i < len; i++) 
           {
               h = 31*h + val[off++];
           }
           hash = h;
       }
       return h;
   }

< C++ > /对于C++ Qt,您可以使用此代码,结果是SAMES,作为java HASCODES/P>
int  hashCode(QString text){
    int hash = 0, strlen = text.length(), i;
    QChar character;
    if (strlen == 0)
        return hash;
    for (i = 0; i < strlen; i++) {
        character = text.at(i);
        hash = (31 * hash) + (character.toAscii());
    }
    return hash; 
}

我遇到了与您相同的问题,希望此代码将帮助您:

int HashCode (const std::string &str) {
    int h = 0;
    for (size_t i = 0; i < str.size(); ++i)
        h = h * 31 + static_cast<int>(str[i]);
    return h;
}

你要炸薯条干什么?这对于答案很重要。boost::hash不是C++03,而是boost。在支持比C++11更广泛的tr1的环境中,您可以使用std::tr1::hash,它在@user4815162342 boost::hash中定义,它不是C++03,而是boost。哦,对了,我怎么能忘记C++ + Boo.jJalf,我从来没有打算暗示Boost是C++的方言,只是Booo::散列不是C++ 03的一部分,例如,STD::String是。我还指出,std::tr1::hash在某些boost不可用的环境中是一种替代方法。这是一个善意的建议,旨在改进一个本来不错的答案,不幸的是,Cat Plus受到了攻击。不,我只是不关心政治。但是tr1::hash也不是C++03的一部分。当然,您是对的,同时提到tr1和boost解决方案很有用,因为有些人可能能够使用其中一种,但不能同时使用这两种解决方案。但最初您将其表示为tr1比boost更像C++03,这是胡说八道它是一个只包含头的库,不需要构建所有的boost。如果您可以使用std::hash来代替,感觉有点过头了。boost的优势是什么?嗯。。。这是一个有点倒退的方式。。。如果希望哈希与Java String兼容,我想这很有用。HashCode如果使用0和字符串长度正确地初始化值,那么它将提供与Java字符串相同的值。但我看到的共识是,在C/C++中没有使用默认函数?这段随机代码来自哪里?我怎么知道这会产生高质量的散列呢?究竟为什么突然认为Qt在起作用?为什么我们要从头开始编写代码,而不使用提供的解决方案?@thecoshman因为有时您希望能够用不同的语言生成相同的哈希值。不使用std::hash或boost hash的原因是我们希望返回值与java.util.String.HashCode相同。
int  hashCode(QString text){
    int hash = 0, strlen = text.length(), i;
    QChar character;
    if (strlen == 0)
        return hash;
    for (i = 0; i < strlen; i++) {
        character = text.at(i);
        hash = (31 * hash) + (character.toAscii());
    }
    return hash; 
}
int HashCode (const std::string &str) {
    int h = 0;
    for (size_t i = 0; i < str.size(); ++i)
        h = h * 31 + static_cast<int>(str[i]);
    return h;
}