【问题标题】:Fastest way to generate hash function from k wise independent hash family for small k(<=5)为小 k(<=5) 从 k 明智的独立散列族生成散列函数的最快方法
【发布时间】:2018-03-09 02:50:14
【问题描述】:

当 k 很小 (&lt;= 5) 时,我需要一个来自 k 明智独立散列系列的散列函数 h[n]:[t]。或者我需要从[1-t] 中均匀随机选择n 个哈希值,这样它们就是k wise independent。我正在尝试在需要的地方实现一些随机算法。我使用

[1-t]范围内生成n个随机数

scipy.stats.randint(0,self._t).rvs(self._n)

但这对我的应用程序来说似乎太慢了。因为我不需要完全随机性,但只需要 4 次独立,我想知道我是否可以加快速度。我知道我可以使用多项式哈希族来获得 k 明智的独立性,但这是最好的吗?如果是,是否有任何我可以插入的快速实现?如果不是,有哪些替代方法(库,可能在 Python 中)?

我看过这个帖子Obtaining a k-wise independent hash function,但我不确定接受的答案是什么意思: "如果你需要 k 个不同的哈希,只需重复使用相同的算法 k 次,使用 k 个不同的种子"。

非常感谢任何建议。谢谢。

【问题讨论】:

  • 如果我是对的,您的目标是以最快的方式在[1-t] 范围内生成n 随机数(至少4 次独立)。
  • @EngineeredBrain 是的,这些数字应该是从 [1-t] 中统一随机挑选的。谢谢。

标签: python random hash murmurhash


【解决方案1】:

你可以尝试使用numba的jit和numpy的random.randint()

import scipy.stats
import numpy as np
from numba import jit

def randint_scipy(n):
    return scipy.stats.randint(0, 10000).rvs(n)

def randint_numpy(n):
    return np.random.randint(0, 10000, n)

@jit
def randint_numpy_jit(n):
    return np.random.randint(0, 10000, n)

%timeit randint_scipy(5)
%timeit randint_numpy(5)
%timeit randint_numpy_jit(5)

输出:

1.09 ms ± 10.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
4.63 µs ± 149 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
960 ns ± 50.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

因此,numpy + numba 比 scipy 的 randint() 实现快 1135 倍

【讨论】:

    【解决方案2】:

    获得真正的 k 向独立哈希函数的最快方法是在有限域上评估 k 次多项式。 最快的方法可能是使用少进位乘法。 例如代码见https://github.com/speedyhash/shorthash/blob/master/include/clhash.h#L248

    一般来说,您应该看到 Wikipedia 文章中的“技术”部分:https://en.wikipedia.org/wiki/K-independent_hashing#Techniques

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2010-10-19
      • 2023-03-23
      • 2018-12-29
      相关资源
      最近更新 更多