【问题标题】:Compact alternatives to UUID as a correlationIdUUID 的紧凑替代品作为相关 ID
【发布时间】:2020-08-14 08:43:33
【问题描述】:

我正在向我们的公共和私有 API 添加相关 ID。这是为了能够通过日志跟踪请求进度。 UUID 是长字符串,占用大量空间。我需要一个紧凑的替代 UUID 作为相关 ID。

如果相关 ID 在修复期(比如 2 个月)后重复出现,那没关系,因为不再需要跟踪比这更早的 API 请求。

我考虑过使用java.util.Random nextLong()。但不保证不会重复。

此外,SecureRandom 可能会造成一些性能问题,这是我的理解,而且我不需要相关 ID 是安全的。

最好考虑其他选项。

【问题讨论】:

  • 不使用/首选 UUID 的原因是什么?我见过使用 UUID 作为跟踪 id 的服务(也许你可以用时间戳作为后缀)
  • UUID 字符串很大,所以,为了节省日志空间,我想要其他选择。
  • 时间戳(纪元)是一个选项,但不是唯一的(我假设您想将它用于跨机器运行的服务)
  • 如何使用时间戳,例如 System.currentTimeMillis()System.nanoTime() ?两种方法都返回一个long
  • 另外,如果不是 UUID 的长度,那么对于您的目的来说,可接受的 ID 长度是多少?

标签: java random


【解决方案1】:

如果您可以接受最多 8 个字符的 ID,则可能的 ID 数量取决于这些 ID 的字符集。

  • 对于十六进制字符(16 个字符集),ID 的数量为 4294967296 或 2^32。
  • 对于 A-Z、0-9(36 个字符集),ID 的数量为 2821109907456 或大约 2^41。
  • 对于 base64 或 base64url,0-9(63 个字符集),ID 的数量为 248155780267521 或大约 2^47。

您应该决定使用哪个字符集,并问问自己您的应用程序是否可以检查 ID 的随机性以及您是否可以容忍重复 ID 的风险(这样您就不会遇到使用 @ 随机生成它们的问题987654323@)。还要注意以下几点:

  • 重复的风险取决于可能的 ID 数量。粗略地说,在您的应用程序随机生成所有可能 ID 的平方根之后,重复的风险变得不可忽略(在十六进制 ID 的情况下,将在 65536 个 ID 之后发生)。请参阅“Birthday problem”了解更精确的语句和公式。
  • 如果您的应用程序分布在多台计算机上,您可以选择为每台计算机分配一个唯一值以包含在 ID 中。
  • 如果您不关心相关 ID 是否安全,您可以选择通过对顺序 ID 执行可逆操作(例如可逆混合函数或线性同余生成器)来创建唯一 ID。
  • 你说SecureRandom“会造成一些性能问题”。除非您尝试并衡量您的应用程序的性能,否则您不会知道它是否会。使用SecureRandom 生成 ID 对于您的目的而言可能会也可能不会太慢​​。

有关进一步的考虑和建议,请参阅我在“Unique Random Identifiers”上写的内容。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2016-12-27
    • 2019-11-19
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多