如何为文档中的每个对象提供唯一的ID?

时间:2010-10-27 04:30:32

标签: java algorithm computer-science uniqueidentifier

我正在创建一个位图编辑器,其中文档由多个图层组成,每个图层代表一个位图。与文档中当前存在的所有其他图层相比,每个图层必须具有唯一的ID。我还需要考虑到我需要保存和加载文档以及图层ID。

我正在使用命令模式存储对文档执行的操作,而唯一ID用于跟踪应对其执行操作的层。

目前,我只保留一个名为X的计数器,当创建一个新图层时,其ID设置为X,然后X递增。加载时,我需要确保将X设置为适当的数字,以便为新图层指定唯一ID,即我可以保存X的值并恢复它,或者根据加载的最大图层ID设置X.

鉴于X是一个32位数字,用户需要在ID开始重用之前创建4,294,967,296个层在同一个文件上工作,这将导致奇怪的行为。我应该实施一个更好的独特ID系统还是这个通常足够好?

我是Java,所以我可以使用UUID库,根据标准算法创建128位唯一ID。这看起来有点矫枉过正。

是否有一些解决此类问题的一般方法?

2 个答案:

答案 0 :(得分:4)

这非常好。以24/365每秒十个新层的速度,这是愚蠢的,它将运行大约三年。

答案 1 :(得分:0)

如果您认为可以以编程方式操作图层,因此在图像的生命周期中有可能有2 ^ 32个图层,则在读取文件时将所有图层ID都抛出到HashSet中,并在更新时更新该图层你添加/删除图层。 (您不需要显式存储该集合;与每个掩码关联的ID就足够了。)然后,不要使用“下一个数字”,而是“不在集合中的下一个数字”。拥有一个计数器仍然有用,但是当你读取文件时将它设置为0或(max + 1)是无关紧要的;除非你设想同时存在大量的层,否则它不会花费大量的时间来找到一个空的空间。

但是既然你正在使用Java,你可以使用long而不是int,然后你就不会(实际上)能够溢出数字,即使你所做的只是创建一个像素掩盖并一遍又一遍地摧毁它。