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

suf*_*que 21 c++ string hash hashcode

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

String uri = "Some URI"
public int hashCode() {
    return uri.hashCode();
}
Run Code Online (Sandbox Code Playgroud)

我想将此代码翻译为c ++.c ++中是否有任何可用的功能或一种简单的方法来翻译它.

Cat*_*lus 63

在C++ 03中boost::hash.在C++ 11中std::hash.

std::hash<std::string>()("foo");
Run Code Online (Sandbox Code Playgroud)

  • `boost :: hash`不是C++ 03,而是提升.在支持`tr1`(比C++ 11更广泛使用)的环境中,你可以使用``tr1/functional>`中定义的`std :: tr1 :: hash <T>`. (4认同)
  • @jalf我从来没有打算暗示boost是C++的一种方言,只是说`boost :: hash`不是C++ 03的一部分,例如,`std :: string`就是.我还指出`std :: tr1 :: hash`是一些在某些不支持boost的环境中可用的替代方法.这是一个善意的建议,以改善一个不错的答案,不幸的是,Cat Plus Plus不幸遭到了攻击. (4认同)
  • 不,我只是不关心政治. (4认同)
  • 但是`tr1 :: hash`也不是C++ 03的一部分.当然,你提到tr1和boost解决方案是有用的,因为有人可能会使用其中一个而不是两个.但最初你提出它好像`tr1`在某种程度上是"更多C++ 03"而不是'boost`,这是无稽之谈.:) (3认同)

tun*_*2fs 15

Boost提供了一个哈希函数:

提升哈希

#include <boost/functional/hash.hpp>

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

    return string_hash("Hash me");
}
Run Code Online (Sandbox Code Playgroud)

  • 它只是一个头文件库,无需构建所有的boost. (9认同)

小智 6

以下是String.hashCode()Java中默认的源代码,这是一个在C++中实现的trival练习.

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

  • 好吧...有点屁股倒退的方式...我想如果你希望你的哈希与Java String.hashCode()兼容,这是有用的 (3认同)