早上好,
我正在寻找一种方法来组合两个整数来创建一个唯一的数字,我有两个表需要组合成一个具有唯一数字的第三个表,
这些是我的表格:
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#来编写解决方案。
谢谢,
答案 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