哈希函数何时相互正交?

Posted

技术标签:

【中文标题】哈希函数何时相互正交?【英文标题】:When are hash functions orthogonal to each other? 【发布时间】:2014-03-09 16:31:14 【问题描述】:

您能否提供一个 Java 中两个相互正交的哈希函数的示例?

【问题讨论】:

我刚搜了这个词,跟着第一个链接,有一个定义…… 嘿乔恩,问题的谷歌提要非常快。这个问题已经在谷歌上排名前 4:散列函数正交。但是,由于我更改了问题,Google 结果不再是最新的。尽管如此,这证明之前在***上没有问过这个问题。 ;) 我说链接是 Stack Overflow 吗?不必在 SO 上定义所有内容。我通常认为,如果一个问题可以通过输入一个简单(且显而易见的)查询并按照第一个链接来回答,那么这个问题就不值得问了。 所以你真的看过了吗?如果您能说明您发现的内容以及最重要的是您对描述的困惑之处,将会很有帮助。否则,您会发现人们只是向您引用相同的内容,这是没有帮助的。 不,有一个非常好的资源。 aaai.org/ocs/index.php/ICAPS/ICAPS10/paper/download/1439/1529 【参考方案1】:

来自 (a Google search result paper)

(正交散列函数)两个散列函数h1和h2是正交的, 如果对于所有状态 s, s' ∈ S 其中 h1 (s) = h1 (s') 和 h2 (s) = h2 (s') 我们有 s = s'。

S。 Edelkamp,GPU 上状态空间探索的完美哈希。

在英语中,如果传递给两个不同正交哈希函数的任何两个给定值产生相同的输出,则这些输入必须是相同的值。

例子:

Let h and g be hash functions.
Let b be a currently unknown value.
h(0) = h(b) = 5
g(0) = g(b) = 4
if h and g are orthogonal, b MUST equal 0.

Thus for any values given to h that result in a unique result,
If those same values are given to g, they must also result in a unique result,
  IF they are orthogonal hash functions.

伪代码:

// Assume no wraparound will ever occur due to overflow.
HashFunc h = x -> x + 1;
HashFunc g = y -> y + 2;
h(0) = 1 // No other input value results in --> 1
g(0) = 2 // No other input value results in --> 2
// These must have been orthogonal hash functions.

// Now for some non-orthogonal hash functions:
// Let the domain be integers only.
HashFunc j = x -> ceil(abs(x / 2));
HashFunc k = x -> ceil(sqrt(x));
j(0) = 0 // Unique result
k(0) = 0 // Unique result
j(1) = j(2) = 1
k(1) = 1 != k(2) = 2 
// k(1) results in a unique value, but it isn't unique for j.
// These cannot be orthogonal hash functions.

【讨论】:

而不是“如果任何两个给定值传递给两个不同的散列函数”,你的意思是说“如果任何两个给定值传递给两个不同的 正交 散列函数”,我相信... @Floris 不错。我会解决的。很抱歉造成混乱。 这是使用 Java 8-ish 表示法(自发布之日起一个月左右将推出。)【参考方案2】:

来自http://www.aaai.org/ocs/index.php/ICAPS/ICAPS10/paper/download/1439/1529

通过 Google 获得:define "orthogonal hash"(第二次点击)。

翻译:

如果你有一个“完美的哈希函数”,那么h(s) == h(s') iff s == s'

如果您有“任意两个散列函数”的值 ss' 两者都有

h1(s) == h1(s') and h2(s) == h2(s')

如果以上对 s == s' 成立,则这些函数称为正交函数

这实际上是一个相当棘手的概念。如果 h1 和 h2 都是完美的散列函数,那么根据上述定义,它们将自动必须是正交的(如果我理解正确的话)。但是你可以拥有符合上述定义的不完美函数。

例子:在状态空间[0, 9],两个函数

h1(int x) return x % 5;

h2(int x) return x % 7;

将是正交的:

x  h1  h2
0   0   0
1   1   1 
2   2   2
3   3   3
4   4   4
5   0   5
6   1   6
7   2   0
8   3   1
9   4   2

在上面,h1(s) = h1(s') 对于 s 的值对,它们要么是 0,要么是 5。 对于 h1,距离是 07

两个条件都为真的唯一对是距离为0 的对 - 所以只有当s1 == s2 时。因此,这些是正交(尽管不完美)的散列函数。

我认为,这可以回答您问题的两个部分。

【讨论】:

以上是关于哈希函数何时相互正交?的主要内容,如果未能解决你的问题,请参考以下文章

哈希函数详解(一)

证明与计算: 从加密哈希函数到一致性哈希

Hash+哈希+哈希函数

哈希表—哈希函数的设计

入门学习|哈希函数与哈希算法

哈希函数的三个性质