在本地对象中有一个整理面。
collate facet有一个返回long的哈希方法 http://www.cplusplus.com/reference/std/locale/collate/hash/
两个问题:
注意:
我不能使用C ++ 0x功能
提升可能没问题。
答案 0 :(得分:4)
不,没有人真正知道 - 它可能因实现而异。主要要求是(N3092,§20.8.15):
对于所有对象类型存在特化散列的密钥,实例化散列应为:
和(N3092,§20.2.4):
如果出现以下情况,H类型符合Hash要求:
§20.8.15涵盖散列本身对散列结果的要求,§20.2.4。然而,正如你所看到的,两者都非常普遍。提到的表基本上涵盖了另外三个要求:
确切的算法肯定是不指定 - 尽管长度很长,上面的大多数要求实际上只是说明(至少对我来说)看起来非常明显的要求。简而言之,实现几乎可以按照任何方式自由实现散列。
答案 1 :(得分:0)
如果实现使用合理的散列函数,则散列值中应该没有与输入有任何特殊相关性的位。因此,如果散列函数为您提供64个“随机”位,但您只需要其中的32个,则可以根据需要选择值的第一个/最后一个/ ... 32位。你采取哪些并不重要,因为每一位都与下一位一样随机(这就是产生良好散列函数的原因)。
因此,获得32位散列值的最简单但又完全合理的方法是:
int32_t value = hash(...);
(当然,这会将40亿个值的群体折叠为一个,看起来很多,但如果源值的目标值是目标值的四十亿倍,则无法避免。)