整理哈希函数

时间:2010-10-12 01:00:34

标签: c++ local hash-function cryptographic-hash-function

在本地对象中有一个整理面。

collat​​e facet有一个返回long的哈希方法 http://www.cplusplus.com/reference/std/locale/collate/hash/

两个问题:

  • 有人知道使用什么散列方法。
  • 我需要一个32位的值 如果我的长度超过32位,那么是否有人知道将哈希折叠成更短版本的技术。我可以看到,如果做错了,折叠可能会产生很多冲突(尽管我可以应对冲突,因为我需要考虑到这一点,我更愿意,如果他们被最小化)。

注意: 我不能使用C ++ 0x功能
提升可能没问题。

2 个答案:

答案 0 :(得分:4)

不,没有人真正知道 - 它可能因实现而异。主要要求是(N3092,§20.8.15):

对于所有对象类型存在特化散列的密钥,实例化散列应为:

  1. 满足Hash要求(20.2.4),Key为函数调用参数类型,DefaultConstructible要求(33),CopyAssignable要求(37),
  2. 对于左值,可以交换(20.2.2),
  3. 提供两个嵌套类型result_type和argument_type,它们分别是size_t和Key的同义词,
  4. 满足以下要求:如果k1 == k2为真,则h(k1)== h(k2)也为真,其中h是hash类型的对象,k1和k2是Key类型的对象。
  5. 和(N3092,§20.2.4):

    如果出现以下情况,H类型符合Hash要求:

    1. 它是一个函数对象类型(20.8),
    2. 满足CopyConstructible和Destructible(20.2.1)的要求,
    3. 下表中显示的表达式有效且具有指示的语义,
    4. 它满足本子条款中的所有其他要求。
    5. §20.8.15涵盖散列本身对散列结果的要求,§20.2.4。然而,正如你所看到的,两者都非常普遍。提到的表基本上涵盖了另外三个要求:

      1. 哈希函数必须是“纯粹的”(即结果仅取决于输入,而不取决于任何上下文,历史等)。
      2. 该函数不得修改传递给它的参数和
      3. 不得抛出任何例外。
      4. 确切的算法肯定是指定 - 尽管长度很长,上面的大多数要求实际上只是说明(至少对我来说)看起来非常明显的要求。简而言之,实现几乎可以按照任何方式自由实现散列。

答案 1 :(得分:0)

如果实现使用合理的散列函数,则散列值中应该没有与输入有任何特殊相关性的位。因此,如果散列函数为您提供64个“随机”位,但您只需要其中的32个,则可以根据需要选择值的第一个/最后一个/ ... 32位。你采取哪些并不重要,因为每一位都与下一位一样随机(这就是产生良好散列函数的原因)。

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

int32_t value = hash(...);

(当然,这会将40亿个值的群体折叠为一个,看起来很多,但如果源值的目标值是目标值的四十亿倍,则无法避免。)