用于数据汇总的哈希算法

时间:2015-08-14 19:19:23

标签: algorithm hash

我正在寻找具有一组给定属性的非加密哈希算法,但我不知道如何用谷歌语言来描述它。

问题空间:我有一个64位整数的向量,大部分线性分布在整个空间中。此规则有两个例外:(1)数字0频繁出现,(2)如果出现数字 x ,则更有可能再次出现2 ^ -64 。目标是,给定两个向量 A B ,以便有一个方便的机制来快速检测 A B 不一样。并非所有矢量都具有固定大小,但我想与另一个矢量进行比较的任何矢量都具有相同的大小(也就是说:尺寸检查很简单)。

我唯一的特殊要求是我希望有能力退出"一条数据。换句话说,给定 A [i] = x和散列( A ),计算散列( A )应该很便宜 A [i] = y。换句话说,我想要一个非加密哈希。

我提出的最合理的事情是(在Python-ish中):

# Imagine this uses a Mersenne Twister or some other seeded RNG...
NUMS = generate_numbers(seed)

def hash(a):
    out = 0
    for idx in range(len(a)):
        out ^= a[idx] ^ NUMS[idx]
    return out

def hash_replace(orig_hash, idx, orig_val, new_val):
    return orig_hash ^ (orig_val ^ NUMS[idx]) ^ (new_val ^ NUMS[idx])

这是一个非常简单的算法,它可能工作正常。但是,我编写散列算法的所有经验告诉我,其他人已经以更好的方式解决了这个问题。

1 个答案:

答案 0 :(得分:1)

我认为您所寻找的内容名为homomorphic hashing algorithm,已经讨论过Paillier cryptosystem

从我的讨论中可以看出,现在还没有实际的实施方式。

最有趣的功能,我认为它符合您的需求,是:

H(x*y) = H(x)*H(y)

因此,您可以自由定义单位的下限并依赖该属性。

我几年前使用过Paillier cryptosystem(在某处有一个Java实现,但我没有链接)在我的学习期间,但是就你所做的而言,它要复杂得多寻找。

在某些限制条件下它具有有趣的功能,如下所示:

n*C(x) = C(n*x)

同样,它在我看来与你正在寻找的类似,所以也许你应该搜索这个散列算法系列。我会尝试Google搜索更具体的链接。

参考文献:

This one非常有趣,但也许它不是一个可行的解决方案,因为你的空间是[0-2 ^ 64 [(除非你接受处理大数字)。