【问题标题】:Is there a way to generate a UUID where the first few bytes are fixed depending on inputs?有没有办法生成一个 UUID,其中前几个字节根据输入是固定的?
【发布时间】:2017-04-15 00:38:47
【问题描述】:

有没有一种方法可以生成 UUID,我们可以根据输入来控制 UUID 的前几个字节?

例如,我想要一个类似的函数:

string generateUUID(string input);

如果我这样称呼它:

generateUUID('a') = 00000001-6f42-4d44-acc4-fda717886945
generateUUID('a') = 00000001-9279-48c1-8695-ff088504b800
generateUUID('a') = 00000001-2a6d-4cba-85d5-aabe94bdb5bd

generateUUID('b') = 00000002-2a6d-4cba-85d5-aabe94bdb5bd
generateUUID('b') = 00000002-b46f-4427-83d5-f1244a9f1102
generateUUID('b') = 00000002-5de1-4b7c-94be-5bf07a749e82

等等

因此,如果 uuid 的前 8 个字符是 00000001,那么我知道 'a' 是输入等。

有这样的东西吗?

【问题讨论】:

  • 为什么要根据8位的值改变8个字节?这非常浪费,并且大大减少了不同 UUID 的空间。为什么你认为你需要这样做?
  • 感谢您的回复。我需要在没有任何其他信息的情况下识别 uuid 的发起者,并且我试图弄清楚这样的事情是否可行而不影响 uuid 的质量。

标签: java uuid uniqueidentifier


【解决方案1】:

只要正常生成一个UUID,比如用UUID.randomUUID(),然后用UUID.toString()转换成字符串,最后根据需要替换前8个字符。

【讨论】:

  • 好。简单的。但是,值得注意的是,这样做会使 UUID 冲突的风险增加 2^N,其中 N 是您窃取的位数。在这种情况下,N 是 24。
  • 感谢您的回答。 N在什么时候变得重要?例如,如果我只使用前 2 或 3 个字符,碰撞的概率会降低到微不足道吗?
【解决方案2】:

UUID 有一个方法:public static UUID fromString(String name)。这就是你需要的

【讨论】:

  • 但是如何生成具有适当属性的名称?
  • 此方法是确定性的。我认为 OP 仍然想要随机性。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2019-04-11
  • 2012-01-10
  • 2018-01-22
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多