对于小k(< = 5)

时间:2017-09-27 14:45:52

标签: python random hash murmurhash

当k很小(h[n]:[t])时,我需要来自k个独立散列族的散列​​函数<= 5。或者我需要从[1-t]中随机选择n个哈希值,使它们为k wise independent。我正在尝试实现一些我需要的随机算法。我使用

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

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

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

我看过这个帖子Obtaining a k-wise independent hash function,但我不确定接受的答案意味着什么: &#34; 如果您需要k个不同的哈希值,只需重复使用相同的算法k次,使用k个不同的种子&#34;。

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

2 个答案:

答案 0 :(得分:0)

您可以尝试将numba的<?xml version="1.0" encoding="UTF-8"?> <configuration> <logger name="org.hibernate" level="WARN"/> </configuration> 与numpy的jit结合使用:

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)

因此, numpy + numba的速度比scipy的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) 实施要快1135倍。

答案 1 :(得分:0)

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

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