【问题标题】:Hash function in c++ for string to intc++中的哈希函数,用于将字符串转换为int
【发布时间】:2012-01-23 22:22:02
【问题描述】:

我正在寻找 C++ 中的散列函数将字符串散列为 int。我使用了 CMapStringToPtr,但它有一个名为“GetNextAssoc”的函数,允许将密钥作为字符串检索,这意味着必须存储该字符串并且它会占用大量内存。 是否有任何其他哈希函数获得更少的内存并且不存储字符串?

【问题讨论】:

  • 试试std::hash<std::string>()()。
  • 我不确定我是否理解您的问题。在几乎任何使用散列函数的地方,您还必须跟踪原始数据,因为散列函数都有冲突,并且需要原始数据才能基于散列进行查找以确定或解决冲突时它们发生了。
  • 是的,但由于内存使用,我不需要保留原始数据。我也不想解决冲突,实际上我的目标是保持冲突!
  • 我会使用boost::hash_value(const std::string & val)
  • @Kerrek:std::hash<std::string>()() seems to be a feature of C++11。我的编译器不走运(VS 2008)。

标签: c++ string hash


【解决方案1】:

为此,C++ 有一个内置的散列函数 - 它用于所有 STL 散列容器。

std::hash

PS:你也可以自己制作,只需通过 const 引用传递字符串,并逐个循环遍历其字符,将它们添加到整数,然后按某个值进行 mod :)

【讨论】:

  • 也许我错了,但是您的链接是指一个 SGI 扩展(在 SGI 中定义)并且在 C++11 之前不是 C++ 标准的一部分(在 )。
  • 我会说一半一半。我相信这是一个扩展,但如果它不在您的系统上,我会感到非常惊讶 - 它几乎无处不在。
  • mod by some value 是什么意思?
  • @dustinyourface Mod 表示使用模运算符:cprogramming.com/tutorial/modulus.html。从“Effective Java”中给出一些关于该主题的指导,对于数组中的每个重要字段,执行“result = 31 * result + field”。您可以将结果初始化为诸如 17 之类的随机数。建议使用素数作为乘数(据说它可以减少冲突,但数学超出了我的想象)。
  • std:hash 虽然返回 size_t 而不是 int
【解决方案2】:
 int hash( const string &key, int tableSize) {
   int hashVal = 0;

   for(int i = 0; i<key.length();  i++)
     hashVal = 37*hashVal+key[i];

   hashVal %= tableSize;

   if(hashVal<0)
     hashVal += tableSize;

   return hashVal;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多