我见过人们将任意 python 对象提供给 random.seed(),然后使用从 random.random() 返回的第一个值作为“散列”值。它并没有给出极好的值分布(可以倾斜),但它似乎适用于任意对象。
如果您不需要加密强度的哈希,我想出了一对哈希函数,用于我在布隆过滤器中使用的整数列表。它们出现在下方。布隆过滤器实际上使用这两个散列函数的线性组合来获得任意数量的散列函数,但它们应该在其他只需要一些散布并具有良好分布的情况下工作正常。它们的灵感来自 Knuth 关于线性同余随机数生成的文章。他们将整数列表作为输入,我相信这可能只是您的序列化字符的 ord()。
MERSENNES1 = [ 2 ** x - 1 for x in [ 17, 31, 127 ] ]
MERSENNES2 = [ 2 ** x - 1 for x in [ 19, 67, 257 ] ]
def simple_hash(int_list, prime1, prime2, prime3):
'''Compute a hash value from a list of integers and 3 primes'''
result = 0
for integer in int_list:
result += ((result + integer + prime1) * prime2) % prime3
return result
def hash1(int_list):
'''Basic hash function #1'''
return simple_hash(int_list, MERSENNES1[0], MERSENNES1[1], MERSENNES1[2])
def hash2(int_list):
'''Basic hash function #2'''
return simple_hash(int_list, MERSENNES2[0], MERSENNES2[1], MERSENNES2[2])