使用系统时间作为 UUID

Using system time as UUID

在我的应用程序中,当用户与某人交互时,一个新通知会添加到另一个人的通知列表中。现在我不得不为每个通知分配一个 ID。

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

现在,既然我无论如何都在节省每个通知的时间 (System.currentTimeMillis()),那么将其重新用作 ID 是否安全?

似乎极不可能同时为同一用户生成两个通知。例如。多个人同时喜欢他的 post 等。即使他们喜欢我也不认为我的服务器会在同一时间为每个呼叫提供服务。

EDIT

一个值得考虑的安全示例可以是多个人同时对您的 Facebook post 点赞,并且服务器会为每个事件添加唯一的通知。 (将用户体验放在一边)

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

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

中的毫秒精度

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

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

第二种选择是随机选择一个,但在那种情况下,您需要一个好的熵源,而且它通常比散列法更昂贵且更难预测。

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

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

再想象一下有人试图在您的软件中查找错误。那个人首先会对你只使用系统时间这一事实感到困惑,并假设他正在寻找的错误将与并发相关。他可能会花几个小时调试它。

终于省下这几位了。即使你存储了 100 万个 long 值,你也将使用不到 7 mb 的 space - 现在在 phone 上什至什么都没有 - 尽管有服务器。

因此,添加该值不仅会提高您的应用程序的健壮性(和可理解性),还将确保您不会最终达到 thedailywtf.com ;)