独特的两个整数对

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)

但:

  1. 我必须将结果保存在DB中并将其编入索引.所以我更喜欢它是一个整数,尽可能小.
  2. Zlib.crc32(f(i1,i2))可以保证唯一性吗?

谢谢.

UPD:

实际上,我不确定结果必须是整数.也许我可以把它转换成十进制:(i1> i2)?i1.i2:i2.i1

Lar*_*eth 6

您正在寻找的是一个配对功能.

德国维基百科页面的下图清楚地显示了它的工作原理:

http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Pairing-function.svg/350px-Pairing-function.svg.png

在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位数据类型才能存储所有可能的组合.)