为唯一组合生成哈希

时间:2015-01-09 11:41:38

标签: php

我在数据库中有一个连接表,它将不同的实体链接在一起,它们可以按任意顺序存储。所以,你可以:

|column1|column2|
+-------+-------+
12345   |67890  

|column1|column2|
+-------+-------+
67890   |12345  

这将被视为相同的关联,顺序无关紧要。

我很想知道创建哈希的最佳方法,无论ID通过什么顺序,哈希都是一样的。

这是我能想到的最好的:

function relationship_hash()
{
    $params = func_get_args();
    sort($params);
    return md5(implode(',', $params));
}

所以relationship_hash(12345,67890)和relationship_hash(67890,12345)都会生成相同的哈希值。这可以使用任意数量的值并找到该组合的哈希值。

无论数据库设计是否有效,我只是对为这种用例生成哈希的方法感到好奇。

1 个答案:

答案 0 :(得分:2)

您可以使用无序pairing function从另外两个号码创建唯一号码。参数顺序无关紧要。

function relationship_hash($n1, $n2) {
    $ret = $n1*$n2+((abs($n1-$n2)-1)^2)/4;
    return md5($ret); // maybe you don't want to use md5 for this
}

echo relationship_hash(12345, 67890), "\n"; // 75071b9bb02d1d75350bd6b926f323f8
echo relationship_hash(67890, 12345), "\n"; // 75071b9bb02d1d75350bd6b926f323f8