【问题标题】:specialised hash table c++专门的哈希表 C++
【发布时间】:2009-06-05 13:30:11
【问题描述】:

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

A34223,34
B23423,-23
23423212,16

我打算做的是将第一个值(键)散列成一个 32 位整数,然后它将成为稀疏结构的键,其中将添加“值”(全部从零开始)数字并且为负数.

鉴于它们的密钥很短且是字母数字,有没有一种方法可以在 32 位 x86 架构上生成快速的哈希算法?或者是否有现有的合适哈希?

我对哈希的设计一无所知,但希望由于输入简单,有一种方法可以生成高性能哈希,以保证给定密钥长度“X”和具有高分散性,因此当长度超过“X”时可以最大限度地减少碰撞。

【问题讨论】:

    标签: c++ hash hashtable


    【解决方案1】:

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

    只有在您用尽了这些选项之后,您才应该考虑实现自己的哈希表和哈希函数。

    【讨论】:

    • 谢谢。你是对的。我应该先尝试一个微不足道的。散列部分是程序中的一个单独功能,在性能方面相当不错。只要这不会增加超过 33% 的运行时间,我应该没问题。
    【解决方案2】:

    很难保证不发生冲突。

    在你的情况下,钥匙

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 2019-03-26
        • 2023-03-04
        • 2013-08-20
        • 2012-10-03
        相关资源
        最近更新 更多