专门的哈希表c ++

时间:2009-06-05 13:30:11

标签: c++ hash hashtable

我需要计算很多不同的项目。我正在处理一对配对列表,例如:

A34223,34
B23423,-23
23423212,16

我打算做的是将第一个值(键)散列为32位整数,这将是稀疏结构的关键,其中“值”将被添加(所有从零开始)数字并且为负数

鉴于它们的密钥是短的和字母数字的,有没有办法生成在32位x86架构上快速的哈希算法?或者是否存在合适的哈希?

我对哈希的设计一无所知,但希望由于简单的输入,有一种方法可以生成一个高性能哈希,保证给定密钥长度“X”不会发生冲突,具有高色散,因此当长度超过“X”时,最小化碰撞。

3 个答案:

答案 0 :(得分:8)

当您使用C ++时,您应该做的第一件事是使用std :: map创建一个简单的implimentation。它足够快(可能会)?如果是这样,请坚持下去,否则请调查您的C ++实现是否提供了哈希表。如果是这样,使用它来创建一个简单的实现,测试,计时。是否足够快(几乎肯定是)?

只有在您完成这些选项之后,才应考虑实现自己的哈希表和散列函数。

答案 1 :(得分:1)

难以保证无碰撞。

在你的情况下,键

A34223
B23423
23423212

可以轻松地转换为32位整数。

这是一个很好的函数,可以从字符串生成哈希值:

/**
 *  "The Practice of Programming", Hash Tables, section 2.9, pg. 57
 *
 *  computes hash value of string
 */
DWORD
strhash( char* str )
{
  //#define MULTIPLIER 31 or 37
  unsigned int   h;
  unsigned char* p;

  h = 0;
  for ( p=(unsigned char*)str; *p != '\0'; p++ )
    h = 31 * h + *p; // <- FIXED MULTIPLIER

  return h;
}

答案 2 :(得分:1)

检查Bob Jenkin's website是否有良好的哈希函数。 IIRC它与Perl中使用的哈希相同。