2011-09-01 55 views
0

可能重复:
Generate a unique value for a combination of two numbers散列 - 始终获得独特的散列对于给定的对用户ID

有没有办法凑两个用户ID(整数),并且始终为给定的一对用户ID获取唯一的哈希值?

例如:

a = hash(x , y); 

b = hash(y , x); 

在上述示例中,a和b必须始终相当于用于在INT(11)的范围内的任何给定的一对ID的集合( MySQL的)。

Plain PHP是编程环境。

任何建议,欢迎家伙...

+1

INT(11)不存在。 (11)只是显示宽度,并且由于(unsigned)int的最大值为10个字符宽,并且它可能会被填充(当指定时)为11个字符。更多[here](http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html)。但这是不合时宜的。 ;) – CodeCaster

回答

4

总结数字并不能使一个独特的哈希值。例如,1 + 3 == 2 + 2。这样做:

function myHash($id1, $id2) { 
    $ids = array($id1, $id2); // or func_get_args() to support variable number 
    sort($ids); 
    return md5(implode('-', $ids); // md5() == any other hashing function 
} 

myHash(x, y) == myHash(y, x); 
+1

这实在不太可能会有碰撞,但不能保证。 (但是如果你确实发现了碰撞,请将你的结果发布在密码学期刊上 - 人们会对它非常感兴趣)。 – user9876

+1

@ user9876由于输入集已知(对于int,-2147483648到2147483647,对于unsigned int,从0到4294967295),您可以“轻松”检查该函数是否存在冲突。您可以运行一个测试来检查所有组合并查看是否发生冲突。但是再次,你不必散列,你可以简单地存储“N1 +分隔符+ N2”,并且由于(至少一个MD5)散列占用32个字符,所以存储不应该成为问题。 – CodeCaster