创建 returns 一组的随机散列函数

Creating random hash function that returns a set

考虑以下代码:

def xorHash(n):
    mask = random.getrandbits(32)
    def xorIt(x):
        return (hash(x) ^ mask) % n
    return xorIt  

这个 returns 一个随机散列函数,它将元素映射到 {0,1,...,rng-1} 中的数字。

我想创建一个随机哈希函数,将每个元素精确映射到 {0,1,...,rng-1} 中的 k 个元素(不重复)。上面的例子完成了 k=1 的工作。

What is the most efficient way of creating a random hash function which returns a k-sized random subset of {0,1,...,rng-1}?

如果范围相对较小,那么您可以创建一个项目数组。 您将通过随机生成随机项目并将第一个项目与生成编号的项目交换来随机排列项目。

如果你的范围比较大,你可以在整个范围内生成数字,如果你得到一个不唯一的项目,再试一次。

顺便说一下,您的代码存在一个问题,即您的号码可能未统一分配,因为您使用了 % 运算符。提醒技术会对小数字产生偏见,您可以在以下帖子中阅读更多内容:

Whosebug question

How much bias is introduced by the remainder technique

使用数据的普通整数值随机散列为 RNG 播种,并使用它从所需范围中抽取随机样本:

def generate_randomized_set_valued_hash_function(n, k):
    hashfunc = generate_randomized_hash_function()
    def set_valued_hashfunc(x):
        rng = random.Random(hashfunc(x))
        return set(rng.sample(xrange(n), k))
    return set_valued_hashfunc

您选择的 RNG 和整数值哈希函数将取决于您需要集值哈希函数的强度和速度。