有一种简单的方法可以从两个整数的复合键创建一个唯一的整数键吗?

abe*_*ger 5 t-sql math primary-key uniqueidentifier composite-key

由于与问题没有太大关系的各种原因,我有一个带有由两个整数组成的复合键的表,我想从这两个数字中创建一个唯一的键.我最初的想法只是将它们连接起来,但是当我意识到(51,1)的复合键会产生与(5,11)相同的唯一键时,我很快就遇到了问题,即511.

有没有人有一种聪明的方法来生成两个整数中的整数,这样生成的整数对于一对起始整数是唯一的?

编辑:在面对令人印象深刻的数学后,我意识到我应该包括的一个细节是有问题的键的大小.在始发对中,第一个密钥当前是6位数,并且在系统的生命周期中可能保持7位数; 第二个关键还没有超过20个.鉴于这些限制,看起来问题就不那么令人生畏了.

rec*_*ive 21

如果您希望生成的密钥包含与其两个组件相同的位数,则可以在数学上证明这是不可能的.但是,如果你从两个32位整数开始,并且可以使用64位int作为结果,你显然可以这样做:

key1 << 32 | key2
Run Code Online (Sandbox Code Playgroud)

  • 然后伪造那个乘法的母亲.:-)我认为"key1*2 ^ 32"完成同样的事情,但我的数学有点生疏. (4认同)
  • +1,即使“key1”是 32 位整数,然后“key1 &lt;&lt; 32 == 0”(您应该首先将其转换为 64 位) (2认同)

Mat*_*all 5

这已经在相当多的细节中进行了讨论(正如递归所说,但是,输出必须包含比单个输入更多的位)。

以唯一且确定性的方式将两个整数映射为一个

如何使用两个数字作为映射键

http://en.wikipedia.org/wiki/Cantor_pairing_function#Cantor_pairing_function


eri*_*len 2

乘以一个足够高的值

SELECT id1 * 1000000 + id2
Run Code Online (Sandbox Code Playgroud)

或者使用文本连接:

SELECT CAST(CAST(id1 AS nvarchar(10)) + RIGHT('000000' + CAST(id2 AS nvarchar(10)), 6) AS int)
Run Code Online (Sandbox Code Playgroud)

或者跳过整数并用非数字分隔 ID:

SELECT CAST(id1 AS nvarchar) + ':' + CAST(id2 AS nvarchar)
Run Code Online (Sandbox Code Playgroud)