Sav*_*ash 3 ruby database crc32
可能重复:
以唯一且确定的方式将两个整数映射到一个
我正在尝试为两个整数(Ruby)创建唯一标识符:
f(i1,i2) = f(i2, i1) = some_unique_value
Run Code Online (Sandbox Code Playgroud)
那么,i1 + i2,i1*i2,i1 ^ i2-不唯一以及(i1> i2)?"i1"+"i2":"i2"+"i1".
我认为以下解决方案可以:
(i1>i2) ? "i1" + "_" + "i2" : "i2" + "_" + "i1"
Run Code Online (Sandbox Code Playgroud)
但:
谢谢.
UPD:
实际上,我不确定结果必须是整数.也许我可以把它转换成十进制:(i1> i2)?i1.i2:i2.i1
?
您正在寻找的是一个配对功能.
德国维基百科页面的下图清楚地显示了它的工作原理:

在Ruby中实现:
def cantor_pairing(n, m)
(n + m) * (n + m + 1) / 2 + m
end
(0..5).map do |n|
(0..5).map do |m|
cantor_pairing(n, m)
end
end
=> [[ 0, 2, 5, 9, 14, 20],
[ 1, 4, 8, 13, 19, 26],
[ 3, 7, 12, 18, 25, 33],
[ 6, 11, 17, 24, 32, 41],
[10, 16, 23, 31, 40, 50],
[15, 22, 30, 39, 49, 60]]
Run Code Online (Sandbox Code Playgroud)
请注意,您需要将此配对的结果存储在数据类型中,其数据类型与输入数字放在一起的位数一样多.(如果两个输入数字都是32位,那么显然需要一个64位数据类型才能存储所有可能的组合.)