【问题标题】:How to give each object in a document a unique ID?如何给文档中的每个对象一个唯一的 ID?
【发布时间】:2010-10-27 04:30:31
【问题描述】:

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

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

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

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

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

这类问题有一些通用的方法吗?

【问题讨论】:

  • 您是否有令人信服的理由使用 UUID?
  • 我唯一能想到的是 1) UUID 128 位 ID 占用更多空间,并且比普通整数更慢 2) UUID 方法的概率性质让我感到不安(不是很好原因,但你去)。我的意思是,我是否只是尽可能频繁地创建新的 UUID,并期望它们始终是唯一的,即使它们是随机生成的?

标签: java algorithm computer-science uniqueidentifier


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    但是由于您使用的是 Java,因此您可以只使用 long 而不是 int,然后即使您所做的只是创建一个像素,您(实际上)也永远不会溢出数字一次又一次地掩饰并摧毁它。

    【讨论】:

    • 这些都是非常好的观点,谢谢!使用 Java 的 UUID 库(使用 128 位 ID)的一个优点是我不必担心该代码中的错误。自己管理 ID 需要我进行更多测试。嗯...我想我可以在启动时将我的计数器设置为零,并且每当我需要一个新 ID 时,只需不断增加它,直到找到一个未使用的 ID。
    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多