|
|
1
171
这个神奇的数字是用一个 special multi-threaded test program MurmurHash ,并且几乎和使用时一样好(不是很好) AES . 一个微小的优势是,相同的常数被使用了两次(在我上次测试时,它确实使它稍微快了一点,不确定它是否仍然是这样)。
如果替换
对于64位数字,我建议使用下面的方法,尽管它可能不是最快的。这个是基于 splitmix64 ,这似乎是基于博客文章 Better Bit Mixing
对于Java,使用
更新:您可能还需要查看 Hash Function Prospector 项目,其中列出了其他(可能更好)常量。 |
|
|
2
52
克努特的乘法方法:
通常,您应该选择一个按哈希大小顺序排列的乘数(
编辑:这个散列函数最大的缺点是它保留了可整除性,所以如果你的整数都可以被2或4整除(这并不少见),那么它们的散列也会被整除。这是哈希表中的一个问题-最终只能使用1/2或1/4个存储桶。 |
|
|
3
30
取决于数据的分布方式。对于简单计数器,最简单的函数
将是好的(我怀疑是最优的,但我无法证明)。 |
|
|
4
16
要生成具有优异质量的哈希函数,请参见 PCG 用于生成随机数 事实上,这也是rrxmrrxmsx_0和杂音散列在有意或无意中使用的配方 我个人发现
足够好 一个好的散列函数应该
让我们首先看一下标识函数。它满足1。但不是2: 输入位n确定输出位n,其相关性为100%(红色),而没有其他相关性,因此它们为蓝色,给出了一条完美的红线 将这两者结合在一起会得到以下输出,仍然满足1。当两个双射函数的组合产生另一个双射函数时 第二次应用乘法和xorshift将产生以下结果:
|
|
|
5
7
|
|
|
6
6
This page 列出了一些简单的散列函数,这些函数通常都很正常,但是任何简单的散列函数都有一些病态的情况,在这些情况下,它不能很好地工作。 |
|
|
7
3
这里有一个很好的关于一些散列算法的概述 Eternally Confuzzled . 我推荐鲍勃·詹金斯(Bob Jenkins)的一次一个散列,它可以快速到达雪崩,因此可以用于高效的散列表查找。 |
|
|
8
2
|
|
|
9
1
我认为在不事先知道数据的情况下,我们不能说散列函数是“好的”!而且不知道你要用它做什么。 对于未知的数据大小,有比哈希表更好的数据结构(我假设您在这里对哈希表进行哈希处理)。当我知道有“有限”数量的元素需要存储在有限的内存中时,我个人会使用哈希表。在开始考虑我的散列函数之前,我会尝试对我的数据做一个快速的统计分析,看看它是如何分布的等等。 |
|
|
10
1
对于随机散列值,一些工程师说黄金比例素数(2654435761)是一个糟糕的选择,根据我的测试结果,我发现它不是真的;相反,2654435761很好地分配了散列值。
哈希表大小必须是2的幂。
我试过:
根据我的测试结果,我发现黄金比率素数总是有更少的空桶或零空桶和最短的碰撞链长度。 一些整数的散列函数声称是好的,但测试结果表明,当total_data_entry/total_bucket_number=3时,最长链长度大于10(max collision number>10),很多bucket没有映射(空bucket),这是非常糟糕的,与黄金比率素数散列法计算空桶数为零、最长链长为3的结果进行了比较。
|
|
|
11
1
我一直在使用
in-depth analysis
的最后一步中使用的64位混频器
|
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 2 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 2 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 2 年前 |