-
29-09-2019 - |
题
在本地的对象有一个核对方面。
该核对方面具有的散列方法,该方法返回长。
http://www.cplusplus.com/reference/std/locale/collate/hash/
两个问题:
- 有没有人知道什么样的散列方法是使用。
- 我需要一个32位数值。
如果我长时间的长度超过32位,没有任何人知道有关的技术折的散列入一个较短的版本。我可以看到,如果做不正确地折叠可以产生许多冲突(虽然我可以应付的冲突因为我需要考虑到这一点无论如何,我希望如果他们是最小化)。
注:我不能使用C++0x功能
提高可以确定。
解决方案
没有,没有人真正知道--它可以从一个实现到另一个。主要的要求(N3092,§20.8.15):
所有对象类型的关键为其中存在着一个专业化散,例哈希应:
- 满足的散列要求(20.2.4),与关键的功能调用的参数类型,DefaultConstructible要求(33),CopyAssignable要求(37),
- 可以插入(20.2.2)为左值,
- 提供两种嵌套的类型result_type和argument_type将其同义词的位置和关键,分别
- 满足要求,如果k1==k2是真的,h(k1)==h(k2)也是如此,其中h是一个目的类型散和k1和k2类型的对象的关键。
和(N3092,§20.2.4):
一种类型H满足的散列要求,如果:
- 这是一个函数目类型(20.8),
- 它satisifes的要求CopyConstructible和破坏(20.2.1),
- 表达下表所示是有效和具有指示的义,
- 它满足所有其他要求在这个子句.
§20.8.15涵盖要求的结果的散列,§20.2.4的散列本身。正如你可以看到,但是,两者都是很一般。该表所提到的基本上涵盖了三个要求:
- 散列函数必须是"纯洁"(即,结果只取决于所输入的,没有任何背景、历史等)。
- 功能不能修改的说法是通过它,
- 它必须不扔任何例外。
准确算法肯定是 不 虽然指定的--尽管长度,大多数上述要求的是真的只是声明的要求(至少对我来说),似乎很明显的。总之,执行的是免费实施的散列的几乎任何方式。
其他提示
如果执行使用一个合理的散列函数时,不应该有位的散列值得拥有任何特别相关的输入。因此,如果散列函给你的64"随意"位,但你只想32他们,你就可以采取的第一个最/...32位的价值。这些是你采取并不重要,因为每一位是随机的下一个(这是什么使得一个良好的散列函数)。
所以最简单的和尚未完全合理的方式获得的一个32位的散列值就是:
int32_t value = hash(...);
(当然,这崩溃团的4亿美元值降到的一个,这看起来想了很多,但是,这不可避免的,如果有的四十亿倍之多的来源的价值观作为目标的价值。)
不隶属于 StackOverflow