组合两个整数以创建唯一编号

早上好,

我正在寻找一种方法来组合两个整数来创建一个唯一的数字,我有两个表,我需要组合成一个具有唯一数字的第三个表,

这些是我的表:

Table A SchoolID ClassId 107 56644231 107 56644532 107 320110212 Table B SchoolID ClassId 108 566442310 108 56644532 108 50110212 

我需要将这些字段导出到第三个表,该表将类ID和学校ID组合到一个名为classID的字段中。 我需要能够将这些数字组合在一起,然后才能将它们组合在一起,以便将schoolid和classid分开以进行更新。 我想连接字符串'schoolid + '00' + 'classid'因为我知道schoolid将始终是一个3位数字,但我正在寻找其他方式或许数学,我不必使用字符串强制转换。

有数学方法可以做到这一点吗? 或者是为了做到这一点,最好的方法是使用字符串?

我正在使用C#来编写解决方案。

谢谢,

与Magnus Hoff类似,但我建议使用二元友好方法而不是基础10方法。

 combinedid = (classid << 8) + schoolid; 

然后,后来:

 classid = combinedid >> 8; schoolid = combinedid & 0xFF; 

我认为从编程的角度来看这是更直接的一点(明确表示你的学校ID是1字节(0-255),类ID是3字节)。

您也可以使用bigint(Long / Int64)轻松完成此操作,使两个int32安全地成为一个int64:

 combinedid = ((long)classid << 32) + schoolid; 
 combinedid = classid*1000 + schoolid 

然后,后来:

 classid = combinedid / 1000 // Integer division schoolid = combinedid % 1000 

我会像这样结合ID:

 ID = ClassID * 1000 + SchoolID 

然后,您可以像这样获得SchoolID

 SchoolID = ID % 1000 

你可以得到这样的ClassID

 ClassID = ID / 1000 

如果SchoolID始终为3位数,则将ClassId乘以1000,然后添加SchoolID。

你的号码可能会“溢出”,并且如果它们是32位,那么你会得到它们。

您表明您正在使用表格。 这让我相信你在数据库中工作。

所以我不得不问,为什么不将它们存储在单独的列中并使它们成为简单的外键? 为什么要创建试图连接数字或用数学方程转换数字的模糊性?

如果您使用另一个表,则可以使用自动增量字段,并且三个字段的组合(按您指定的顺序)将为您提供唯一的ID。

 |------------------- | My_combine_table |------------------- | id | auto_inc |------------------- | SchoolID | ... | SchoolID2 | ... 

这个SO线程有详细的各种其他数学方法,有些只是更好。 但对于你的情况,我怀疑这些是不是好主意。 我会说你应该将两个id保存在第三个表中,该表有自己唯一的id(主键)列。

使用((a + b)(a + b + 1)* 0.5)+ b参考http://en.wikipedia.org/wiki/Pairing_function