【问题标题】:Creating random hash function that returns a set创建返回集合的随机哈希函数
【发布时间】:2015-11-15 07:11:04
【问题描述】:

考虑以下代码:

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 大小随机子集的随机哈希函数的最有效方法是什么?

【问题讨论】:

  • 不要使用range 作为参数名称。这是一个非常重要的内置程序,您可以使用它。
  • @MikeMüller - 更改,谢谢。
  • “没有重复”是否意味着您想要一个完美的哈希函数,或者 [0, rng) 中的k 元素是不同的?您是否考虑过使用k 哈希函数(或者是关于如何创建这些函数的问题)?
  • @MichaelFoukarakis - 是的,我需要 k 不同的值。拥有k 哈希函数可能会返回重复项。我可以保留多个k,然后将结果唯一化,希望我有k 不同的值,但这似乎效率低下并且可能会失败。
  • 如果您将散列函数的结果视为位串,则将其中的k 连接起来生成最终散列不会产生重复。不过,对于大型 k,它可能效率不高。

标签: python random set sampling


【解决方案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 和什么整数值散列函数将取决于您需要设置值散列函数的强度和速度。

【讨论】:

    【解决方案2】:

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

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

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

    stackoverflow question

    How much bias is introduced by the remainder technique

    【讨论】:

    • 感谢您的回答。 % 对我有用,因为我将 IPV4 地址(32 位)散列到 {0,1,...,255} 范围内,因此不会产生偏差。我需要为每个元素获取一个 64 大小的随机范围子集,而显式保存似乎非常昂贵(主要是在我需要多个这样的哈希函数时)。
    • 听起来像是一个小范围的数字,所以我认为你应该对一组封闭的数字进行洗牌。你需要生成多少次?
    • 取决于输入。我从单个哈希开始,如果存在则添加其他哈希
    • 两者都可以很好地工作,但封闭集和交换将具有更好的时间性能,因此除非您有真正的内存限制,否则请使用那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多