我正在寻找具有一组给定属性的非加密哈希算法,但我不知道如何用谷歌语言来描述它。
问题空间:我有一个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])
这是一个非常简单的算法,它可能工作正常。但是,我编写散列算法的所有经验告诉我,其他人已经以更好的方式解决了这个问题。
答案 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 [(除非你接受处理大数字)。