我正在尝试设计一个系统来将大于65535的整数值打包成ushort。让我解释。将Int32转换成ushort并返回
我们有一个系统,它使用来自SQL Server的IDENTITY列生成Int32值,并受到生产中的客户端API的限制,该API将我们的Int32 ID溢出到ushorts。幸运的是,客户端只有大约20个具有这些ID的事件实例 - 让我们称之为包 - 在任何给定的时间,它只需要让它们在本地兄弟姐妹中是唯一的。普遍接受的解决方案是我们的Int32 ID转换为ushorts(没有我的意思不是铸造,我的意思翻译)它们传送到客户端之前,但有这种方法倒钩:
- 有些ID的少由于未到期,任何时候65535可能仍会在特定的客户端上运行。
- 我们不能有任何ID冲突 - 也就是说,如果包ID 1进入客户端,跟踪从Int32中删除多少次65535以便在应用到65536时创建一个ushort的算法也会导致1碰撞。
- 我们必须能够在返回时重建Int32。
我们可用来解决这个问题,什么是呼应给我们一个符号字节场,给了我们127倍的值(因为我们使用0-9别的东西真的117)一起玩。我将这里称之为“字节字段”。
我们已经讨论了三种不同的转换例程:
- 乘:专卖店在字节字段多少次,我们从我们的Int32删除65535做一个USHORT。如上所述,这具有碰撞问题。
- 序列化会话状态:对于每个客户端,根据有关该客户端的事实生成会话ID。然后存储一个从1开始的1:1转换表,直到交付的包的数量,以便当客户端再次访问我们的服务器时,可以将包的库存转换回其已知的数据库ID。这有开销问题,因为我们会将序列化会话状态支持到数据库,并且我们希望每秒支持数百到数千个事务。
- 多变的算法方法,其中字节字段是采用Int32并将其转换为ushort的转换算法的ID。很明显,其中很多将会是简单的Multiplicative(为了增加我们可以转换的ID的上限),但有些必须乘以更小的边界(如32768),并添加/减去一个数字以便接近在兄弟姐妹中可以保证唯一的号码。这种方法是处理器密集型的,但应该允许我们在保持可扩展性的同时避免冲突(尽管采用这种方法我们有一个有限的上限,在由于升级导致的问题自行消失之前不会达到)。
所以我的问题是:是否有比我的方法更好的方法上面,如果不是,我应该在算法方面关注(对#3的方式),以1-65535之间时产生了一些给定的数字是否大于0并且不能是单向散列?
澄清:它不是ushort ceiling是最大的问题,它的客户端API使用ushort,所以我不能将客户端上的字节字段合并为更大的值(客户端API是不可升级的,但最终会阶段不存在)。
接受从未回答的问题列表中解决此问题,这是对问题的解决方案的一个很好的解释。 – cfeduke 2008-11-03 05:37:33