从三个整数生成唯一的2字节整数

时间:2015-08-29 09:41:59

标签: c# unique unique-key

我有三个整数:

  • 第一个数字范围为1-600
  • 第二个数字范围为0-4
  • 第三个数字范围为0-14

我需要从上面的整数中生成一个2字节的唯一整数,以便:

  • 再次使用相同的号码会产生相同的号码
  • 能够从唯一号码
  • 取回所有三个号码
  • 唯一编号应为> 0&& < 32768(2字节)

我已经搜索了解决方案,但是大多数解决方案将字节数从2到4个字节加倍,这在我的情况下不是一个选项。

3 个答案:

答案 0 :(得分:4)

首先,让我们将第一个范围转换为0-599,标记为first-1以下。然后,您需要做的就是将数字乘以,使用范围最大值作为乘数:

range_of_first = 599 + 1 = 600
range_of_second = 4 + 1 = 5
range_of_third = 14 + 1 = 15

(first-1) + range_of_first * second + range_of_first * range_of_second * third
= (first-1) + 600*second + 600*5*third
= result

您可以获得的最大值是599 + 600 * 4 + 600 * 5 * 14 = 44999

这不符合有符号的2字节整数(-32768..32767)。它适合2字节无符号整数(0..65535)。

如果必须将其拟合为有符号整数,那么最简单的方法是以32位进行计算,然后从结果中减去(44999-32768),因此它将适合2字节有符号整数的范围。然后在解码之前做反转。

相反,你需要分工和提醒:

first = result % range_of_first + 1 // +1 to get values 1..600
second = result / range_of_first % range_of_second
third = result / range_of_first / range_of_second // % range_of_third redundant

以上所有数字都假定为非负数,并假设通常的整数除法舍入,即只是截断任何小数。

答案 1 :(得分:0)

将它们转换为零填充的字符串。用零填充后连接它们。然后将它们转换回整数。

所以20-1-8会成为" 020108"然后在20108,当你把它变成一个整数。

要获取数字,请重新转换为字符串并根据位数从右向左解析。

答案 2 :(得分:0)

我认为hyde意味着(第一个)+ range_of_first *第二个+ range_of_first * range_of_second *第三个 =(first-1)+ 600 * second + 600 * 5 * third  =(first-1)+ 600 * second + 3000 * third。

您需要存储45000个不同的值,因此您无法将它们装入2个有符号的字节中,但它们将适合2个无符号字节。