哪些散列函数彼此正交?

时间:2014-02-13 00:31:24

标签: hash hash-collision error-correction hash-code-uniqueness reed-solomon

我对多级数据完整性检查和纠正感兴趣。在使用多个纠错码的情况下(它们可以是相同类型的代码中的两个)。我的印象是,如果使用的2个哈希码彼此正交,使用2个代码的系统将实现最大效率。

是否有与哪些代码正交的列表?或者您是否需要使用相同的散列函数但具有不同的参数或用法?

我希望第一级ecc是reed-solomon代码,虽然我实际上并没有控制第一个函数,因此我不能使用具有改进功能的单个代码。

请注意,我并不关心加密安全性。

编辑:这不是

的副本

1 个答案:

答案 0 :(得分:1)

我不确定甚至可以枚举所有正交散列函数。但是,您只询问了一些示例,因此我将努力提供一些关于哪些属性似乎导致正交散列函数的直觉。

a related question开始,这两个函数彼此正交:

Domain: Reals --> Codomain: Reals
f(x) = x + 1
g(x) = x + 2

这是一个非常明显的案例。如果散列函数是(两者)完美散列函数,则更容易确定正交性。请注意,术语“完美”在数学意义上是指,而不是将永远用作哈希函数。

完美的哈希函数满足正交性要求是一个或多或少的简单案例。只要函数是injective,它们就是完美的散列函数,因此是正交的。类似的例子:

Domain: Integers --> Codomain: Integers
f(x) = 2x
g(x) = 3x

在前一种情况下,这是一个内射函数,但不是bijective,因为在域中每个元素映射到的codomain中只有一个元素,但是在codomain中有许多元素没有映射一点都不这些仍然适用于完美的散列和正交性。 (请注意,如果Domain / Codomain是Reals,那么这将是一个双射。)

非内射函数分析起来比较棘手。但是,如果一个函数是单射的而另一个函数不是单独的,那么它们总是如此:正交:

Domain: Reals --> Codomain: Reals
f(x) = e^x // Injective -- every x produces a unique value
g(x) = x^2 // Not injective -- every number other than 0 can be produced by two different x's
因此,一个技巧是知道一个函数是单射的而另一个函数不是。但是,如果两者都不是内射的呢?我目前不知道一般案例的算法,除了暴力之外还会确定这个算法。

Domain: Naturals --> Codomain: Naturals
j(x) = ceil(sqrt(x))
k(x) = ceil(x / 2)

这两种函数都不是单射的,在这种情况下,由于存在两个明显的非内射函数:ceilabs与受限域相结合。 (实际上,大多数哈希函数的域都不会比整数更宽松。)测试值会显示jk不会产生非唯一结果时反之亦然:

j(1) = ceil(sqrt(1)) = ceil(1) = 1
j(2) = ceil(sqrt(2)) = ceil(~1.41) = 2
k(1) = ceil(x / 2) = ceil(0.5) = 1
k(2) = ceil(x / 2) = ceil(1) = 1

但是这些功能呢?

Domain: Integers --> Codomain: Reals
m(x) = cos(x^3) % 117
n(x) = ceil(e^x)

在这些情况下,这些函数都不是单射的(由于模数和细胞),但它们何时发生碰撞?更重要的是,对于x的值的元组,它们都有碰撞吗?这些问题很难回答。我怀疑它们不是正交的,但没有特定的反例,我不确定我能否证明这一点。

当然,这些并不是您可能遇到的唯一哈希函数。因此,确定正交性的技巧首先要看它们是否都是单射的。如果是这样,它们是正交的。其次,看看一个是否是单射的。如果是这样,它们不是正交的。第三,看看你是否可以看到导致它们不是单射的函数部分,看看你是否可以确定它的周期或特殊情况(例如x = 0)并尝试提出反例。第四,访问math-stack-exchange并希望有人可以告诉你他们在哪里打破了正交性,或者证明他们不这样做。