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

时间:2010-11-22 17:51:16

标签: c# string math integer

早上好,

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

这些是我的表格:

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#来编写解决方案。

谢谢,

7 个答案:

答案 0 :(得分:15)

与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;

答案 1 :(得分:7)

combinedid = classid*1000 + schoolid

然后,后来:

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

答案 2 :(得分:5)

我会像这样结合ID:

ID = ClassID * 1000 + SchoolID

然后你可以像这样获得SchoolID

SchoolID = ID % 1000

你可以像这样得到ClassID

ClassID = ID / 1000

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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