好的哈希函数。

时间:2018-04-06 01:44:27

标签: algorithm hash

我无法解决这个问题(这实际上是一种练习)。 John对整数有一个很好的散列函数g(x)。但是他需要为字符串提供良好的哈希函数,而他想到的第一件事就是:

def h(s):
if s == '':
    return 0
else:
    return g(g(ord(s[0]) + h(s[1:])))

这个功能好吗?这对姓氏有用吗?

1 个答案:

答案 0 :(得分:1)

良好的哈希函数将相对平衡。通过这种方式,我的意思是你输入它的预期数据将尽可能地平均填充各种存储桶。

因此,你很可能是积分哈希,是一个好的"一,将有这个属性。

如果你考虑有多少人姓史密斯(或者王,如果你反对文化偏见),有多少人有姓Zemeckis(或谌),这将均匀分布,以便Smith /王桶可能更大。

因此,在均衡的积分分布之上铺设不均衡的姓氏分布可能会产生比您预期的更糟糕的结果。

老实说,对于姓氏,我可能只计算出可能的数据集并根据它进行分发。例如(仅使用拉丁字母,为了简单起见),让我们说分布是这样的:

Surname first letter     % of data set
--------------------     -------------
         A                    10%
         B                    10%
         C                    10%
         D                    10%
         E                    10%
         F                    10%
        G-Z                   40% total, exactly 2% per letter.
                             ----
                             100%

理想的分布如下:

Bucket     Letters     % of data set
------     -------     -------------
   0          A             10%
   1          B             10%
   2          C             10%
   3          D             10%
   4          E             10%
   5          F             10%
   6         G-K            10%
   7         L-P            10%
   8         Q-U            10%
   9         V-Z            10%
                           ----
                           100%

在这种情况下,理想的哈希函数将是(伪代码而不是Python):

def myHash(surname):
    # Use bucket zero for blank and those not starting with letter.

    if surname == '':
        return 0

    firstChar = upperCase(surname[0])
    if firstChar not in 'A'..'Z':
        return 0

    # A..G go to bucket 0..5.

    if firstChar < 'G':
        return ord(firstChar) - ord('A')

    # Then each bucket from 6 onward gets five letters.

    return (ord(firstChar) - ord('G')) / 5 + 6