什么是有效的 UUID?

问题描述 投票:0回答:4

我生成 UUID,并根据代码中的正则表达式验证它们;我刚刚遇到了让我困惑的问题

这是生成 UUID 的代码(在 mongodb 上下文中)

import java.util.UUID;
... ...

Document setOnInsert = new Document(Params.sender, UUID.randomUUID())
                                    .append(Params.userDevice, userDevice)
                                    .append(Params.hostId,"");

这是验证UUID的代码;我从这篇post

复制了正则表达式
static final Pattern UUID = Pattern.compile("([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})");

    public static boolean isUUID(String uuid){
        if(uuid == null){
            return false;
        }else{
            return UUID.matcher(uuid).matches();
        }
    }

下面是我遇到问题的 2 个 UUID

aa4aaa2c-c6ca-d5f5-b8b2-0b5c78ee2cb7
b24dd64c-de6b-5bf6-6283-aa2167cc93a7

这两个UUID是由上述代码生成的;在我最近的调试中,验证方法(isUUID())判断它们无效;但我将这些 UUID 发布到在线 validator ,它说可以

这是我的系统信息

wjz@bj:~$ java -version 
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
wjz@bj:~$ 
wjz@bj:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:    16.04
Codename:   xenial
wjz@bj:~$ 

一些背景:我一直在研究jdk 1.8.0_111;这些UUID当时已经生成,没有任何问题。然后我今天升级到1.8.0_121,遇到这个问题...

所以我的问题是:上面提到的UUID是正确还是错误?相信谁,生成器还是验证

java regex java-8 uuid
4个回答
8
投票

我的建议是,不要重新发明轮子。

基本上,如果您使用

UUID.randomUUID()
生成 id,则无需验证它们。 如果您无论如何都好奇它们可能会被手动操纵。 您可以只使用
UUID.fromString(yourUUID)
并接住
IllegalArgumentExcepetion
和可能抛出的
NumberFormatException

投掷

IllegalArgumentExcepetion

如果名称不符合 toString() 中描述的字符串表示形式

此外,您可以使用

检查 UUID 是否已正确转换
UUID id = UUID.fromString(yourUUID);
if(id.toString().equals(yourUUID){
    //success
}

4
投票

您可以使用

UUID.randomUUID()
它将生成有效的 UUID,您不需要 regx。


1
投票

查看了其他一些 SO 答案、其他语言...,这是一个处理 v4 情况的纯 Java 解决方案(Java 8 中默认使用的):

 UUID myUuid = UUID.fromString(uuidStr); // Step 1, throws errors !
 ... myUuid.version() == 4 // Step 2, check for the version you desire

参见:https://docs.oracle.com/javase/9/docs/api/java/util/UUID.html#version--

这是一个完全有效的 UUID 字符串的示例,但版本 1:

  public static void main(final String[] args) {
    final UUID myUuid = UUID.fromString("61614667-d279-11e7-a5ac-f941ac8dfc39");
    System.out.println(myUuid.version()); // Prints 1, not 4 !
  }

要尝试更多 v4 UUID,请使用

UUID.randomUUID()
或在线: https://www.uuidgenerator.net/version4

注意:Java的

UUID.randomUUID()
可以很好地工作,请参阅Java的UUID.randomUUID有多好?

安全说明:

用于检索类型 4(伪随机生成)UUID 的静态工厂。 UUID 是使用“加密”强伪随机生成的 数字生成器


1
投票

UUID 总长度
  • 使用的角色
  • 组的有效大小(破折号之间)
  • 小写或大写
  • 有效版本
  • 有效变体
  • 不允许
  • 要查看代码示例,请参阅我最近添加到 Apache Commons Validator 的 UUID 验证器实现。它尚未合并,但您可以在这里投票:
https://github.com/apache/commons-validator/pull/68

© www.soinside.com 2019 - 2024. All rights reserved.