English 中文(简体)
如何给文档中的每个对象一个唯一的ID?
原标题:How to give each object in a document a unique ID?

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

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

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

假设X是一个32位数字,用户需要在同一文件上创建4294967296层,然后ID才能开始重用,这将导致奇怪的行为。我应该实现一个更好的唯一ID系统吗?或者这通常足够好吗?

我使用Java,所以我可以使用UUID库,该库根据标准算法创建128位唯一ID。不过,这似乎有些过头了。

对于这类问题,有没有一些通用的方法?

最佳回答

如果您认为可以通过编程方式操作层,从而在图像的生存期内有2^32层的可能性,那么在读取文件时将所有层ID放入哈希集,并在添加/删除层时更新该集。(您不需要显式存储集合;与每个掩码关联的ID就足够了。)然后,不要取“下一个数字”,而是取“不在集合中的下一个号码”。有一个计数器仍然很有用,但在读取文件时,是否将其设置为0或(max+1)无关紧要;除非你设想同时存在大量令人困惑的层,否则找一个空的空间不会花很长时间。

但是,由于您使用的是Java,您可以只使用long而不是int,然后(实际上)就永远无法溢出数字,即使您所做的只是创建一个一像素的掩码并一遍又一遍地破坏它。

问题回答

这已经足够好了。以每秒24/365十层的速度,这很愚蠢,它将运行大约三年。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签