代码之家  ›  专栏  ›  技术社区  ›  Loki Astari

整理哈希函数

  •  2
  • Loki Astari  · 技术社区  · 15 年前

    在本地对象中有一个collate方面。


    http://www.cplusplus.com/reference/std/locale/collate/hash/

    两个问题:

    • 有人知道使用什么散列方法吗。
    • 我需要一个32位的值。
      如果我的long超过32位,有人知道将散列折叠成较短版本的技术吗。我可以看到,如果做得不正确,折叠可能会产生很多冲突(尽管我可以处理冲突,因为我需要考虑到无论如何,我宁愿他们被最小化)。


    增强可能没问题。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Jerry Coffin    15 年前

    对于存在专门化哈希的所有对象类型密钥,实例化哈希应:

    1. 可以(20.2.2)交换左值,
    2. 提供两个嵌套类型result_type和argument_type,它们分别是size_t和Key的同义词,
    3. 满足如果k1==k2为真,h(k1)==h(k2)也为真的要求,其中h是hash类型的对象,k1和k2是Key类型的对象。

    以及(N3092,§20.2.4):

    1. 它是函数对象类型(20.8),
    2. 下表中显示的表达式是有效的,并且具有指定的语义,以及
    3. 它满足本子条款中的所有其他要求。

    §20.8.15包括散列结果的要求,§20.2.4关于散列本身。不过,正如你所看到的,两者都相当普遍。上面提到的表格基本上涵盖了另外三个要求:

    1. 函数不能修改传递给它的参数,并且

    确切的算法肯定是

        2
  •  0
  •   sth    15 年前

    如果实现使用合理的哈希函数,则哈希值中不应存在与输入有任何特殊关联的位。所以,如果hash函数给你64个“随机”位,但你只需要其中的32个,你可以只取第一个/最后一个/。。。32位,随你怎么说。你取哪一个并不重要,因为每一个位都和下一个位一样随机(这就是一个好的散列函数的原因)。

    因此,获得32位散列值的最简单但又完全合理的方法是:

    int32_t value = hash(...);
    

    (当然,这会将40亿个值的组压缩为一个,看起来很多,但如果源值是目标值的40亿倍,这是不可避免的。)

    推荐文章