我正在尝试设计一个将大于 65535 的整数值打包到 ushort 中的系统。让我解释。
我们有一个系统,它使用 SQL Server 的 IDENTITY 列生成 Int32 值,并受到生产中客户端 API 的限制,该 API 将我们的 Int32 ID 溢出到 ushorts。幸运的是,客户端在任何给定时间只有大约 20 个具有这些 ID 的事物实例(我们称它们为包),并且它只需要使它们在本地兄弟姐妹中是唯一的。普遍接受的解决方案是将我们的 Int32 ID 转换为 ushorts(不,我不是指强制转换,我的意思是翻译),然后再将它们传输给客户端,但是这种方法存在一些问题:
- 由于未过期,某些小于 65535 的 ID 可能随时在给定客户端上运行。
- 我们不能有任何 ID 冲突 - 也就是说,如果包 ID 1 发送到客户端,则跟踪从 Int32 中删除 65535 多少次以在应用于 65536 时进行 ushort 的算法也会导致 1 从而导致冲突。
- 我们必须能够在返回时将 ushort 重构为 Int32。
我们可以用来解决这个问题的是一个单一的有符号字节字段,它会回显给我们并给我们 127 个值来玩(实际上是 117,因为我们使用 0-9 来做其他事情)。从这里开始,我将其称为“字节字段”。
我们已经讨论了三种不同的翻译例程:
- 乘法:在字节字段中存储我们从 Int32 中删除 65535 以制作 ushort 的次数。这具有如上所述的碰撞问题。
- 序列化会话状态:对于每个客户端,根据有关该客户端的事实生成一个会话 ID。然后存储一个从 1 到交付的包裹数量的 1:1 转换表,这样当客户端再次访问我们的服务器时,可以将包裹清单转换回它们已知的数据库 ID。这存在开销问题,因为我们要将序列化会话状态备份到数据库,并且我们希望每秒支持数百到数千个事务。
- 各种算法方法,其中字节字段是转换算法的 ID,该算法采用 Int32 并将其转换为 ushort。显然,其中许多将是简单的乘法(以增加我们可以转换的 ID 上限),但有些必须乘以较小的边界(如 32768),并加上/减去一个数字才能接近可以保证在兄弟姐妹中唯一的数字。这种方法是处理器密集型的,但应该允许我们在保持可扩展性的同时避免冲突(尽管使用这种方法,我们有一个有限的上限,在 ushort 问题由于升级而自行消失之前无法达到)。
所以我的问题是:有没有比我上面的方法更好的方法,如果没有,我应该在算法方面寻找什么(对于方法#3),当给定数字大于0 并且不能是单向哈希?
澄清:最大的问题不是 ushort 上限,而是客户端 API 使用 ushort,所以我无法组合客户端上的字节字段以获得更大的值(客户端 API 不可升级,但最终会逐步淘汰)。