2010-10-27 88 views
1

我正在制作一个位图编辑器,其中一个文档由多个图层组成,其中每个图层都表示一个位图。与文档中当前存在的所有其他图层相比,每个图层都必须具有唯一的ID。我还需要考虑到我需要保存和加载文档以及图层ID。如何给文档中的每个对象一个唯一的ID?

我使用的命令模式来存储在文档上执行,并且唯一的ID被用于跟踪哪些层的应执行上的动作的动作。

此刻,我只是保持一个称为X计数器,当创建一个新层,它的ID设置为X,则X递增。加载时,我需要确保将X设置为适当的数字,以便为新图层赋予唯一ID,即我可以保存X的值并恢复该值,或者根据加载的最大图层ID设置X.

假设X是一个32位的号码,用户将需要创建4,294,967,296层在同一个文件上工作之前的ID开始得到重用,这将导致怪异的行为。我应该实施一个更好的独特的身份证系统吗?或者这通常足够好?

我在Java中,所以我可以使用UUID库,它根据标准算法创建128位唯一ID。尽管这似乎过分了。

这种问题是否有一些通用的方法?

+0

您是否有一个令人信服的理由_不使用UUID? – 2010-10-27 10:10:34

+0

我能想到的唯一的情况是1)UUID 128位ID占用更多空间,比普通整数比较慢2)UUID方法的概率性质使我感到不安(不是一个很好的理由,但你去了)。我的意思是,我是否只是按照自己的想法创建新的UUID,并期望它们始终是唯一的,即使它们是随机生成的? – RichardNewton 2010-10-27 16:48:22

回答

0

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

不过既然你使用的是Java,你可以只使用一个长而不是一个整数,然后你就不会永远(实际而言)能够溢出的数量,即使你所做的一切是创建一个单像素掩码并一遍又一遍地摧毁它。

+0

这些都是非常好的一点,谢谢!使用Java的UUID库(使用128位ID)的一个亲是我不必担心该代码中的错误。自己管理ID将需要我进行更多的测试。嗯......我想我可以在启动时将计数器设置为零,并且无论何时我需要一个新的ID,只要不断增加它直到找到一个未使用的ID。 – RichardNewton 2010-10-27 05:49:57

4

这已经足够好了。以24/365每秒10个新图层的速度,这是愚蠢的,它将运行良好大约三年。

相关问题