-->

产生k成对独立的散列函数(Generating k pairwise independent has

2019-07-31 04:47发布

我想实现一个计数敏素描在斯卡拉的算法,所以我需要在生成k两两独立的哈希函数。

这是一个较低的水平,比任何我曾经过编程,我不知道很多关于散列函数,除了从算法类,所以我的问题是:我怎么产生这k两两独立的哈希函数?

我应该使用像MD5或murmur哈希散列函数? 我刚生成的形式的k个散列函数f(x) = ax + b (mod p) ,其中p是素数,a和b是随机整数? (即泛散列家族每个人都在算法101学)

我在找更多的简单不是原始速度(例如,我会采取一些速度较慢的5倍,如果是简单的实现)。

Answer 1:

斯卡拉已经MurmurHash实现的(它的scala.util.MurmurHash )。 它的速度非常快,并在分配值非常好。 加密哈希是矫枉过正 - you'll只是需要几十或几百次的时间比你需要。 只需选择k不同的种子开始,由于它是在质量上几乎密码,你会得到k很大程度上是独立的散列码。 (在2.10,你应该切换到使用scala.util.hashing.MurmurHash3 ;用法是相当不同的,但你仍然可以用混合做同样的事情。)

如果你只需要靠近值映射到随机值远这将工作; 如果你想避免冲突(例如,如果A和B碰撞使用散列1,他们可能不会也将使用散列碰撞2),那么你就需要去至少一个步骤和散列不是整个对象,但它这样子还有的哈希开出不同的机会。



Answer 2:

可能是最简单的方法是采取一些密码散列函数和“种子”它与字节不同的序列。 最实用的目的,结果应该是独立的,因为这是一个加密散列函数应具备的关键属性之一(如果要更换消息的任何部分,哈希应该是完全不同的)。

我会做一些事情,如:

// for each 0 <= i < k generate a sequence of random numbers
val randomSeeds: Array[Array[Byte]] = ... ; // initialize by random sequences

def hash(i: Int, value: Array[Byte]): Array[Byte] = {
    val dg = java.security.MessageDigest.getInstance("SHA-1");
    // "seed" the digest by a random value based on the index
    dg.update(randomSeeds(i));
    return dg.digest(value);
    // if you need integer hash values, just take 4 bytes
    // of the result and convert them to an int
}

编辑:我不知道计数敏素描的精确要求,也许一个简单的功能已经足够了,但是它似乎并没有成为简单的解决方案。

我提出了一个加密散列函数,因为有你有相当强的担保所产生的散列函数会有很大不同,而且很容易实现,只需使用标准库。

在另一方面,如果你有以下形式的两个哈希函数f1(x) = ax + b (mod p)f2(x) = cx + d (mod p) ,则可以计算一个使用另一种(不知道x ),使用一个简单的线性式f2(x) = c / a * (f1(x) - b) + d (mod p) ,这表明它们不是很独立的。 所以,你可以在这里遇到意想不到的问题。



文章来源: Generating k pairwise independent hash functions