我在db中有两个数字字段。一个最多15位数(比如说x),另一个最多5位数(比如说y)。我需要从任何对(x,y)生成唯一数字,这样对于任何其他对(w,z),k(x,y)= k(w,z)当且仅当如果x = w且y = z。
注意:我读过Cantor函数,但由于我对数字长度有一个已知的限制,我想使用更有效的函数来生成最短的密钥。
答案 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)