代码之家  ›  专栏  ›  技术社区  ›  Dexter

使用系统时间作为UUID

  •  1
  • Dexter  · 技术社区  · 9 年前

    在我的应用程序中,当用户与某人交互时,会将一个新通知添加到另一个人的通知列表中。现在我必须给每个通知打一个id。

    这里需要注意的是,Id只需要在给定用户的通知列表范围内是唯一的。此外,我不会存储超过150个通知。

    现在,既然我在保存每个通知的时间(System.currentTimeMillis()),那么也可以将其作为id使用吗?

    同一用户的两个通知几乎不可能同时生成。许多人同时喜欢他的帖子等。即使他们喜欢,我也不认为我的服务器会在同一时间为每个电话服务。

    编辑

    可以考虑的一个安全的例子是,多个人同时喜欢你的Facebook帖子,服务器为每个事件添加一个唯一的通知。(将用户体验放在一边)

    3 回复  |  直到 9 年前
        1
  •  3
  •   Matthias    9 年前

    您仍然应该使用uuid的原因有几个。 首先,因为并发问题的理论是,它们总是不太可能发生。然而,实践表明,它们确实经常发生。

    还可以想象有人试图在你的软件中发现bug。首先,这个人会非常困惑,你只是使用系统时间,并假设他正在寻找的bug与并发相关。他可能会花几个小时来调试。

    最后,保存这几位是没有意义的。即使你存储了100万个长值,你也会使用不到7 mb的空间——这在现在的手机上甚至是零——尽管有服务器。

    因此,添加该值不仅可以提高应用程序的健壮性(和可理解性),还可以确保您不会每天都在工作。com;)

        2
  •  2
  •   midor    9 年前

    时间是计算机中最难处理的事情之一。跨设备的同步是困难的,并且即使对于单个设备时间也可能不是严格单调的,例如,由于调整以校正时钟漂移。这现在可能可行,但使用时间作为标识符将给你带来麻烦,因为你必须处理时区等。

    在您的情况下,我更希望使用哈希函数来创建标识符。通过相应地选择哈希函数,您可以调整冲突的可能性,如果需要,还可以在哈希数据中包含时间。通过对所有相关数据进行哈希运算,可以确保只有真正的重复和冲突才会产生相同的值。哈希的优点是它在没有同步的情况下到处都会产生确定性结果。

    第二种选择是随机选择一个,但在这种情况下,你需要一个好的熵源,而且它通常比哈希更昂贵,更不可预测。

    当然,如果标识符可以由单个实体选择,计数器也是一个选项。对于多方来说,它需要同步,因此不太适合大型同步组。

        3
  •  0
  •   AnkeyNigam    9 年前

    uuid的最佳方法是使用 UUID 类并生成uuid唯一代码。

    但如果您不满意,请尝试使用 System.nanoTime() 因为它的精度是纳秒,而不是毫秒 System.currentTimeMillis