在设计哈希函数时您会考虑哪些问题?

时间:2008-11-11 02:24:06

标签: function hash

我不是在寻找有关散列信息的链接。

我不是在寻找世界上最好的哈希函数。

我对描述

的小故事感兴趣
  • 您正在使用的问题域
  • 您正在使用的数据的性质
  • 您为数据设计哈希函数的过程是什么。
  • 你对自己的成绩感到高兴。
  • 您从可能对他人有价值的经验中学到了什么。

6 个答案:

答案 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)

创建散列算法很容易。发明工作高效有效哈希算法不是。

你应该问问自己:

  1. 我是否需要哈希?
  2. 假设我然后实现了标准的食谱配方(例如Effective Java),包括所有相关的要求(例如,如果a.equals(b)则a.hashCode()== b.hashCode() )
  3. 如果您有两个对象实例需要进行相等性比较,那么您可能需要为equals()提供一个实现。

    如果您有一个需要排序的对象的多个实例,那么您可能需要为compareTo()提供一个实现。

    如果您将自定义对象用作Map的键,那么您可能需要提供hashCode()的实现。

答案 5 :(得分:1)

不完全是我的经验,但你需要考虑的一些条件:

  1. 最重要的是,哈希函数应该类似于等式检查。两个相等的对象应始终始终返回相同的哈希值(两个不相等的对象可以返回相同的哈希值,但这应该是罕见的)。

  2. 更好地利用现有的哈希函数,因为它们很可能在速度和分布之间有更好的平衡。

  3. 哈希函数应该很快。如果得到的哈希值不会产生明显更好的值分布,请不要使它变得更慢/更复杂。 所以数值类型的哈希总是更好(同意大多数框架都有整数类型的哈希,只是说)。

  4. 哈希应该有良好的分布,碰撞的几率必须非常小。因此,XOR是一个糟糕的选择。 换句话说,在速度和分布之间找到一个良好的平衡是关键。如果分发更好,则可能会有较慢的哈希值。

  5. 编写函数,知道输出的大小。如果是int32,则确保不会发生溢出。

  6. 哈希函数绝不应该给出错误(除了有效的空引用)。主要罪魁祸首是整数溢出。处理它。

  7. 如果你在运行时之前知道你可能的输入是什么,那么就有一个功能来定位它以加快速度。

  8. 很可能哈希不一定是可逆的,但如果你需要它(比如从给定的哈希中取回两个数字),请相应地写出来。在一般情况下(散列碰撞时)可能不需要这样做。

  9. 如果您的哈希值仅用于快速比较两个对象,则不要将其用于安全目的。 Cryptographic hashing完全是一个不同的野兽。

  10. 如果您手头有多个散列函数,请运行快速测试以找到哪个更适合您的输入。测试总是比理论分析更好。

  11. 这些是我的头脑。请参阅Eric's blog additionally