我不是在寻找有关散列信息的链接。
我不是在寻找世界上最好的哈希函数。
我对描述
的小故事感兴趣答案 0 :(得分:9)
我考虑的第一个问题是已建立的算法是否符合我的要求。
答案 1 :(得分:2)
进行数据仓库开发。我们有一个大约9,000行的维度。正在开发的查询包括一些非常难看的查询。
所以,我开始分析维度行。根据列的各种组合对维度行进行聚类。聚类是从某个键到共享该键的维度行列表的映射。然后,散列键是列值的元组。
Python中的中间结果看起来像这样
{
( (col1, col2), (col3, col4) ) : [ aRow, anotherRow, row3, ... ],
( (col1, col2), (col3, col4) ) : [ row1, row2, row3. row4, ... ],
}
从技术上讲,这是一个倒排索引。
散列键在构建列值元组时需要一些小心,部分原因是Python不会使用可变集合(即列表)。更重要的是,元组不是简单的列值列表。它们通常是两元组,试图根据键组合将维度行划分为不相交的子集
深入的哈希算法是内置的Python哈希。然而,选择键并不明显或不容易。
答案 2 :(得分:1)
我会说亚当说的话:不要重新发明哈希轮
我唯一需要自定义散列函数的时间是比较有向图的平等性;当两个图形不相等时,哈希函数让我非常有效地说明(当哈希值匹配时,我仍然需要进行逐节点比较以确定)
答案 3 :(得分:1)
我首先想到的是steal
散列算法及其代码的最佳位置。当且仅当我找不到合适的算法时,我才将它们作为创建自己的算法的起点。公平地说,我已经在这个行业工作了7年,而且从大学开始,我从未创建了自己的哈希算法。
但如果我确实创建了自己的算法,那么最小化碰撞应该是最值得考虑的事情。你有什么可能的价值观?此函数是否准确地分散了这些值,以便希望在结果值和原始值之间存在一对一的关系。结果值是否确实很好地分散。意思是说,他们并不都有共同的因素?当您进行模数运算以使值更小并且适合您的索引集合时,这可能会导致冲突。
答案 4 :(得分:1)
创建散列算法很容易。发明工作,高效和有效哈希算法不是。
你应该问问自己:
如果您有两个对象实例需要进行相等性比较,那么您可能需要为equals()提供一个实现。
如果您有一个需要排序的对象的多个实例,那么您可能需要为compareTo()提供一个实现。
如果您将自定义对象用作Map的键,那么您可能需要提供hashCode()的实现。
答案 5 :(得分:1)
不完全是我的经验,但你需要考虑的一些条件:
最重要的是,哈希函数应该类似于等式检查。两个相等的对象应始终始终返回相同的哈希值(两个不相等的对象可以返回相同的哈希值,但这应该是罕见的)。
更好地利用现有的哈希函数,因为它们很可能在速度和分布之间有更好的平衡。
哈希函数应该很快。如果得到的哈希值不会产生明显更好的值分布,请不要使它变得更慢/更复杂。 所以数值类型的哈希总是更好(同意大多数框架都有整数类型的哈希,只是说)。
哈希应该有良好的分布,碰撞的几率必须非常小。因此,XOR是一个糟糕的选择。 换句话说,在速度和分布之间找到一个良好的平衡是关键。如果分发更好,则可能会有较慢的哈希值。
编写函数,知道输出的大小。如果是int32
,则确保不会发生溢出。
哈希函数绝不应该给出错误(除了有效的空引用)。主要罪魁祸首是整数溢出。处理它。
如果你在运行时之前知道你可能的输入是什么,那么就有一个功能来定位它以加快速度。
很可能哈希不一定是可逆的,但如果你需要它(比如从给定的哈希中取回两个数字),请相应地写出来。在一般情况下(散列碰撞时)可能不需要这样做。
如果您的哈希值仅用于快速比较两个对象,则不要将其用于安全目的。 Cryptographic hashing完全是一个不同的野兽。
如果您手头有多个散列函数,请运行快速测试以找到哪个更适合您的输入。测试总是比理论分析更好。
这些是我的头脑。请参阅Eric's blog additionally。