在本地的对象有一个核对方面。

该核对方面具有的散列方法,该方法返回长。
http://www.cplusplus.com/reference/std/locale/collate/hash/

两个问题:

  • 有没有人知道什么样的散列方法是使用。
  • 我需要一个32位数值。
    如果我长时间的长度超过32位,没有任何人知道有关的技术折的散列入一个较短的版本。我可以看到,如果做不正确地折叠可以产生许多冲突(虽然我可以应付的冲突因为我需要考虑到这一点无论如何,我希望如果他们是最小化)。

注:我不能使用C++0x功能
提高可以确定。

有帮助吗?

解决方案

没有,没有人真正知道--它可以从一个实现到另一个。主要的要求(N3092,§20.8.15):

所有对象类型的关键为其中存在着一个专业化散,例哈希应:

  1. 满足的散列要求(20.2.4),与关键的功能调用的参数类型,DefaultConstructible要求(33),CopyAssignable要求(37),
  2. 可以插入(20.2.2)为左值,
  3. 提供两种嵌套的类型result_type和argument_type将其同义词的位置和关键,分别
  4. 满足要求,如果k1==k2是真的,h(k1)==h(k2)也是如此,其中h是一个目的类型散和k1和k2类型的对象的关键。

和(N3092,§20.2.4):

一种类型H满足的散列要求,如果:

  1. 这是一个函数目类型(20.8),
  2. 它satisifes的要求CopyConstructible和破坏(20.2.1),
  3. 表达下表所示是有效和具有指示的义,
  4. 它满足所有其他要求在这个子句.

§20.8.15涵盖要求的结果的散列,§20.2.4的散列本身。正如你可以看到,但是,两者都是很一般。该表所提到的基本上涵盖了三个要求:

  1. 散列函数必须是"纯洁"(即,结果只取决于所输入的,没有任何背景、历史等)。
  2. 功能不能修改的说法是通过它,
  3. 它必须不扔任何例外。

准确算法肯定是 虽然指定的--尽管长度,大多数上述要求的是真的只是声明的要求(至少对我来说),似乎很明显的。总之,执行的是免费实施的散列的几乎任何方式。

其他提示

如果执行使用一个合理的散列函数时,不应该有位的散列值得拥有任何特别相关的输入。因此,如果散列函给你的64"随意"位,但你只想32他们,你就可以采取的第一个最/...32位的价值。这些是你采取并不重要,因为每一位是随机的下一个(这是什么使得一个良好的散列函数)。

所以最简单的和尚未完全合理的方式获得的一个32位的散列值就是:

int32_t value = hash(...);

(当然,这崩溃团的4亿美元值降到的一个,这看起来想了很多,但是,这不可避免的,如果有的四十亿倍之多的来源的价值观作为目标的价值。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top