【问题标题】:Combine two integers to create a unique number结合两个整数来创建一个唯一的数字
【发布时间】:2011-05-14 00:09:23
【问题描述】:

早安,

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

这些是我的桌子:

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

谢谢,

【问题讨论】:

  • 注意不要创建大于存储类型最大容量的新数字。

标签: c# string math integer


【解决方案1】:

类似于 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;

【讨论】:

  • 我很喜欢你的回答。谢谢。
  • 如果 classid 是前面提到的 int32,则代码不正确(classid
  • @thomas - 从技术上讲,你是对的。我已将其更新为在位移之前很久将 classid 转换为。
【解决方案2】:
combinedid = classid*1000 + schoolid

然后,稍后:

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

【讨论】:

  • 就像@JTA 对这个问题的评论一样,小心没有溢出。
【解决方案3】:

我会这样组合 ID:

ID = ClassID * 1000 + SchoolID

然后您可以像这样获得SchoolID

SchoolID = ID % 1000

你可以像这样得到ClassID

ClassID = ID / 1000

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      不过,您的号码可能会“溢出”。如果您拥有的号码是 32 位的,它们就会“溢出”。

      【讨论】:

      • 系统需要 32 位整数,所以这可能是个大问题。我没有想到这一点。感谢您指出。
      【解决方案6】:

      您表示您正在使用一张桌子。这使我相信您正在数据库中工作。

      所以我不得不问,为什么不将它们存储在单独的列中并使它们成为简单的外键呢?为什么要使用数学方程式连接或转换数字会产生歧义?

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

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

      【讨论】:

      • 我正在导出到我无法控制的第三方系统。设置了本地系统,以便每个学校都有自己的数据库,因此我无法控制 classid 在所有数据库中都是唯一的。第三方系统没有schoolId的位置,只有ClassID
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        • 2010-12-17
        • 2018-08-14
        • 1970-01-01
        相关资源
        最近更新 更多