从已知长度限制的两个数字生成最短的唯一编号

时间:2015-09-24 12:09:59

标签: math hash

我在db中有两个数字字段。一个最多15位数(比如说x),另一个最多5位数(比如说y)。我需要从任何对(x,y)生成唯一数字,这样对于任何其他对(w,z),k(x,y)= k(w,z)当且仅当如果x = w且y = z。

注意:我读过Cantor函数,但由于我对数字长度有一个已知的限制,我想使用更有效的函数来生成最短的密钥。

3 个答案:

答案 0 :(得分:0)

将它们连接在一起。 k(111111111111111,22222) = 11111111111111122222。请务必添加前导零:k(3,4) = 300004。如果你把它们留下来,那么k(3,4)将得到与k(0,34)相同的结果。

pigeonhole principle,如果你想要完美的唯一性,你就不能做到超过15 + 5位数。

答案 1 :(得分:0)

让我们说x可以保持0到4之间的数字,y可以保持0到3之间的数字然后你可以创建一个像这样的网格

  x  0  1  2  3  4
 y----------------  
 0|  0  1  2  3  4
 1|  5  6  7  8  9
 2| 10 11 12 13 14
 3| 15 16 17 18 19

给定(x,y),您可以通过x + 5y

找到唯一的数字

例如,(3,2)将是3 + 5 * 2 = 13,如果检查网格,您将看到13是x标签为3的列,y是y标签的行2。

回到另一个方向,给出一个数字可以说16然后x = 16模5 = 1 和y =(16 - x)/ 5 = 3

您可以从网格中看到第1列第3行是数字16。

要将其扩展为您的问题,您的x保持0到999999999999999之间的值,并且您的y保持0到99999之间的值

所以你的公式将是

(x,y)= 1000000000000000 * y + x

答案 2 :(得分:0)

我会将第二个数字的长度存储在第一个数字中,然后连接两个数字,这很容易,并且在每种情况下都可以使用。由于第二个数字最多为5位数,因此我们的第一个数字可以存储该数字。

没有它,如果你想要连接23和45它将是与234和5相同的结果,它们之间的零是相同的情况。

示例:

k(3,4) = 134
k(30,4) = 1304
k(3,40) = 2340
k(3333,4) = 133334
k(3,4321) = 434321
f(x,y)的

表达式为:

n*(10^(n+m))+x*(10^n)+y 
    where 
n = log10(y)+1 m = log10(x)+1 (n and m are integer floor)