如何在python中使用随机哈希函数?

如何在python中使用随机哈希函数?,python,hash,probability,Python,Hash,Probability,我正在尝试实现一个名为tidemark的随机算法。本手册第2单元对此进行了描述。为此,我需要一个随机选择的哈希函数,它将整数[1,…,n]映射到[1,…,n]。Python在库中有一些不同的哈希函数,但我没有找到一个可以让我指定域和范围并随机选择合适函数的函数 这样的事情存在吗?好吧,在我的脑海中,我会背上Python的哈希(),但它会使用随机数扭曲返回的数字。() 这张照片打印出来 447 885 55 765 因此,您可以看出s1和s2是不同的。使用标准md5散列并使用os.uradom作

我正在尝试实现一个名为tidemark的随机算法。本手册第2单元对此进行了描述。为此,我需要一个随机选择的哈希函数,它将整数[1,…,n]映射到[1,…,n]。Python在库中有一些不同的哈希函数,但我没有找到一个可以让我指定域和范围并随机选择合适函数的函数


这样的事情存在吗?

好吧,在我的脑海中,我会背上Python的
哈希()
,但它会使用随机数扭曲返回的数字。()

这张照片打印出来

447 885
55 765

因此,您可以看出
s1
s2
是不同的。

使用标准md5散列并使用os.uradom作为随机种子,散列函数可以通过种子重用

def get_random_hashfunc(_max=1024, seed=None):
    seed = seed or os.urandom(10)
    seed_hash_func = hashlib.md5(seed)
    def hashfunc(n):
        func = seed_hash_func.copy()
        func.update(n.to_bytes(n.bit_length(), 'big'))
        return int.from_bytes(func.digest(), 'big') % _max
    return hashfunc, seed

hash_func1, seed1 = get_random_hashfunc()
hash_func2, seed2 = get_random_hashfunc()
hash_func3, seed3 = get_random_hashfunc(seed=seed1)

>>> hash_func1(123)
156
>>> hash_func2(123)
931
>>> hash_func3(123)
156

你要找的是一份工作。 许多散列算法在内部使用一个随机数,可用于将其推广到通用散列函数

也可以使用any,然后在模数减少之前与大于0的随机整数相乘

根据散列之前的值的分布情况以及散列值的分布情况,这可能完全足够了:

从functools导入部分
从随机导入randint
def散列_族(值,n,salt):#输出为[0,n)(即不包括n)
value=value*(2*salt+1)#乘以0不好
value=value^(value>>(n.bit_length()//2))#xorshift以改善分布
value=value&(1(n.bit_length()//2))#另一个异或移位
value=value&(1>hash_族(23100,56)
73
>>>hash_家族(23100,57)
52
>>>hash_家族(23100,58)
30
>>>随机散列(17100)
42

对于使用python的加密强度,许多散列函数都有一个salt参数,可以使用randint设置,并使用partial绑定以将其用作通用散列函数。范围缩减可以通过模运算完成。

您链接的注释使用“散列函数”在特定意义上,即来自散列族的函数。如果你不知道这意味着什么,最好在继续之前遵循论文中的内容:“如果你不熟悉[2-通用散列族]的概念,强烈建议练习2-1和2-2。”这些练习准确地描述了您在这里需要什么类型的函数。随机选择的函数可能不够。@Brian我知道这意味着什么。我只是想用一种简单的方法在python中实现它,而不必重新发明轮子。我想_max必须是2的幂才能正常工作?
(hash(val)^seed)%如果
max\u val
是二的幂,则max\u val
不会生成独立的哈希函数,这可能是常见的情况。如果
val
是整数,则可以执行
hash(val^seed)%max\u val
操作,前提是
hash()
是一个很好的哈希函数,在我的安装中没有,因为它似乎是标识函数。@WolfgangBrehm
hash()是一个用于(足够小的)整数的标识函数,但不适用于其他任何东西:这对OP来说可能仍然是个问题,因为他想要哈希整数。
def get_random_hashfunc(_max=1024, seed=None):
    seed = seed or os.urandom(10)
    seed_hash_func = hashlib.md5(seed)
    def hashfunc(n):
        func = seed_hash_func.copy()
        func.update(n.to_bytes(n.bit_length(), 'big'))
        return int.from_bytes(func.digest(), 'big') % _max
    return hashfunc, seed

hash_func1, seed1 = get_random_hashfunc()
hash_func2, seed2 = get_random_hashfunc()
hash_func3, seed3 = get_random_hashfunc(seed=seed1)

>>> hash_func1(123)
156
>>> hash_func2(123)
931
>>> hash_func3(123)
156