整理哈希函数

在本地对象中有一个整理面。 整理facet有一个返回long的哈希方法。 http://www.cplusplus.com/reference/std/locale/collat​​e/hash/ 两个问题: 有谁知道使用什么散列方法。 我需要一个32位的值。 如果我的长度超过32位,那么是否有人知道将哈希折叠成更短版本的技术。我可以看到,如果做错了,折叠可能会产生很多冲突(虽然我可以应对冲突,因为我需要考虑到这一点,我更愿意,如果它们被最小化)。 注意: 我不能使用C ++ 0x功能 提升可能没问题。     
已邀请:
不,没有人真正知道 - 它可能因实现而异。主要要求是(N3092,§20.8.15): 对于所有对象类型存在特化散列的密钥,实例化散列应: 满足Hash要求(20.2.4),Key作为函数调用参数类型,DefaultConstructible要求(33),CopyAssignable要求(37), 对于左值,可以交换(20.2.2) 提供两个嵌套类型result_type和argument_type,它们分别是size_t和Key的同义词, 满足以下要求:如果k1 == k2为真,则h(k1)== h(k2)也为真,其中h是类型为散列的对象,k1和k2是Key类型的对象。 和(N3092,§20.2.4): 如果出现以下情况,H类型符合Hash要求: 它是一个函数对象类型(20.8), 它满足了CopyConstructible和Destructible(20.2.1)的要求, 下表中显示的表达式是有效的,并具有指示的语义,和 它满足本子条款中的所有其他要求。 §20.8.15涵盖散列本身对散列结果的要求,§20.2.4。然而,正如你所看到的,两者都非常普遍。提到的表基本上涵盖了另外三个要求: 哈希函数必须是“纯”的(即,结果仅取决于输入,而不取决于任何上下文,历史等) 该函数不得修改传递给它的参数,并且 它不能抛出任何例外。 确切的算法肯定没有指定 - 尽管长度很长,但上面的大多数要求实际上只是说明要求(至少对我来说)非常明显。简而言之,实现几乎可以任意方式自由实现散列。     
如果实现使用合理的散列函数,则散列值中应该没有与输入具有任何特殊相关性的位。因此,如果散列函数为您提供64个“随机”位,但您只需要其中的32个,则可以根据需要选择值的第一个/最后一个/ ... 32位。你采取哪些并不重要,因为每一位都与下一位一样随机(这就是产生良好散列函数的原因)。 因此,获得32位哈希值的最简单但又完全合理的方法是:
int32_t value = hash(...);
(当然,这会将40亿个值的组合折叠为一个,这看起来很多,但如果源值是目标值的四十亿倍,这是无法避免的。)     

要回复问题请先登录注册