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

23

下面的Java代码返回一个字符串的哈希码。

String uri = "Some URI"
public int hashCode() {
    return uri.hashCode();
}

我想将这段代码翻译成C++。有没有C++中可用的函数或简单的方法可以翻译这个?


5
你需要哈希做什么?这对于回答来说很重要。 - Konrad Rudolph
6个回答

75

在C++03中使用boost::hash,在C++11中使用std::hash

std::hash<std::string>()("foo");

5
boost::hash 不是 C++03 的标准,而是 Boost 库中的内容。在支持 tr1 的环境中(比 C++11 更广泛),您可以使用 <tr1/functional> 中定义的 std::tr1::hash<T> - user4815162342
1
@user4815162342 "boost::hash不是C++03标准,而是Boost库。" 哦,对了,我怎么会忘记C++Boost呢。 - Cat Plus Plus
4
我的意思并不是暗示Boost是C++的方言,而是指出boost::hash不像std::string一样是C++03的一部分。我还提到,在某些环境中有可用的替代品std::tr1::hash,当Boost不可用时可以考虑使用它。这只是一个善意的建议,旨在改善一个本来很好的回答,但Cat Plus Plus不幸对此感到冒犯了。 - user4815162342
4
不,我只是不关心政治。 - Cat Plus Plus
3
但是 tr1::hash 在 C++03 中也不是一部分。当然,你说得对,提到 tr1 和 boost 解决方案都很有用,因为有些人可能只能使用其中一个而不能同时使用两个。但最初你表述的好像 tr1boost 更符合 C++03,这是无稽之谈。 :) - jalf
显示剩余6条评论

15

Boost提供了一个哈希函数:

boost hash

#include <boost/functional/hash.hpp>

int hashCode()
{
    boost::hash<std::string> string_hash;

    return string_hash("Hash me");
}

9
这是一个仅包含头文件的库,无需构建整个Boost库。 - tune2fs
1
如果你可以使用 std::hash,那么感觉使用 boost 有点过头了。boost 有什么优势呢? - User12547645

6
以下是Java中默认的String.hashCode()的源代码,这在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;
   }

3
嗯...这种方法有点反常规...如果您想使哈希与Java String.hashCode()兼容,我想这很有用。 - thecoshman
如果你用0和字符串长度正确初始化值,它会产生与Java字符串相同的值。但我看到“共识”是在C/C++中没有默认函数可用? - Bitterblue

4
个人而言,我喜欢使用boost的哈希函数。制作字符串哈希相当简单。请参考http://www.boost.org/doc/libs/1_47_0/doc/html/hash.html
boost::hash<std::string> string_hash;

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

新版的C++中有一个与std::hash等效的函数。

2

我也遇到了你同样的问题,希望下面这段代码能够帮到你:

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;
}

不使用std::hash或boost hash的原因是我们希望得到与java.util.String.HashCode相同的返回值。 - Aero

1

//对于C++ Qt,您可以使用此代码,其结果与Java 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; 
}

3
这段话需要翻译成中文:这个随机代码从哪里来?我如何知道它确实会产生高质量的哈希值?为什么突然认为Qt在起作用?我们为什么要从头开始编写代码,而不使用提供的解决方案? - thecoshman
1
@thecoshman 因为有时候你想要在不同的编程语言中生成相同的哈希值。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接