【问题标题】:JAVA UUID use only numeric characters to generate random UUID [duplicate]JAVA UUID 仅使用数字字符生成随机 UUID [重复]
【发布时间】:2021-06-24 10:06:11
【问题描述】:

我想为我的一个类生成一个序列号,比如xxxxxxxxxx,我希望它的长度正好是 10 个字符。

如何仅使用 "1234567890" 生成随机 UUID。 有什么我必须传递给constructorUUID.randomUUID() 的吗?

我怎样才能给它一个固定的长度?

【问题讨论】:

  • 另外,查看String.format将整数(如long)格式化为10位字符串。
  • 其实我想用UUID类来做一些我可以使用的具体方法。
  • 如果将 UUID 的格式限制为 10 位,那么它不再是 UUID;见RFC 4122

标签: java random uuid


【解决方案1】:

UUID 给出128 bits,其中 10 位数字的范围约为 33 位,使用 210 约为。 103。所以唯一性降低了。

可以做这样的事情:

String randomCode() {
    UUID uuid = UUID.randomUUID();
    long lo = uuid.getLeastSignificantBits();
    long hi = uuid.getMostSignificantBits();
    lo = (lo >> (64 - 31)) ^ lo;
    hi = (hi >> (64 - 31)) ^ hi;
    String s = String.format("%010d", Math.abs(hi) + Math.abs(lo));
    return s.substring(s.length() - 10);
}

这会将 128 位折叠近 4 倍以提供 10 位数字。 就是说不一定是唯一的。

最好使用一个秘密的伪随机序列,需要保存一个状态。或任何其他随机生成器/System.nanos()。

【讨论】:

  • 十进制10位的范围约为33位
  • @saka1029 当然。更改代码。
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2013-01-10
  • 2020-07-30
  • 2017-06-25
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多