我的程序有3种密切相关的内容,我希望能够互换地存储和操作他们的长内容,例如:我可能会有一系列很长的ID,可以用于3种中的任何一种。
使用the allocateIds API我可以在同一名称空间中为3种类型分配ID,但我有时也需要能够分辨出这些ID中的哪一种被引用(例如,为了在正确的种类上进行数据存储操作。
我明白正常'这样做的方法是存储整个Key类型,而不仅仅是long id,但是会有大量的这些 - 如果我可以使用&long;#long;值而不是键值。
因此,我希望能够对ID范围进行分段,因此我可以使用ID调用一个简单的函数,它将告诉我ID的3种类型中的哪一种。< / p>
(我使用的是Java,但我认为这并不重要。)
答案 0 :(得分:0)
分配我自己的ID
我想最直接的方法是简单地分配我自己的ID。我相信,为了分配顺序ID,我需要为每个分配(跟踪分配)进行额外的数据存储写入,或者进入预先分配ID范围的复杂系统。每个实时实例。这听起来不错。
所以我可以生成随机的54位ID - 保留2位用作标志来指示类型。但据我所知,随机或散列分配大大减少了可以安全进行的分配数量。互联网告诉我碰撞的可能性大约是k ^ 2 / 2N,其中k是分配数量,N是分配空间的大小。所以,如果我愿意接受0.1%的碰撞机会,那么k = sqrt(2 * 2 ^ 54/1000)= ~190万。由于我真的不知道我需要存储多少实体,这是不可接受的。
答案 1 :(得分:0)
保留长ID中的一些位以指示种类
另一种解决方案是使用2位长值作为标志来指示类型。最简单的方法是利用分配器现在只使用长的低56位这一事实。所以我可以使用高位作为标志来指示Kind。该解决方案的问题在于我失去了在javascript中操纵这些数字的能力 - 首先是56位限制的原因。
另一种方法 - 保持在js中操作这些数字的选项 - 是使用allocateIdRange并预先分配(并丢弃)对应于位54和55的ID范围。实际上,我可以使用任何位,但如果我使用高位,则指定ID范围会容易得多。
但我对数据存储区以及分配器的实际工作方式知之甚少,所以我不知道这种“预分配和丢弃”技术是不是一个好主意。