创建返回集合的随机散列函数

时间:2015-11-15 07:11:04

标签: python random set sampling

请考虑以下代码:

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

这将返回一个随机哈希函数,该函数将元素映射到{0,1,...,rng-1}中的数字。

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

  

创建随机散列函数的最有效方法是什么,该函数返回{0,1,...,rng-1}的k大小的随机子集?

2 个答案:

答案 0 :(得分:1)

使用数据的普通整数值随机散列对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和整数值散列函数取决于您需要集值散列函数的强度和速度。

答案 1 :(得分:0)

如果范围相对较小,则可以创建项目数组。 你可以通过随机生成一个随机的方式对项目进行随机化,然后将第一个项目与生成的数字进行交换。

如果您的范围相对较大,您可以在整个范围内生成数字,如果您获得的项目不是唯一的,请再试一次。

顺便说一句,您的代码存在一个问题,即您的数字可能不是统一分布的,因为您使用的是%运算符。提醒技术会为小数字创建偏差,您可以在以下帖子中阅读更多内容:

stackoverflow question

How much bias is introduced by the remainder technique