我生成 UUID,并在代码中使用正则表达式进行有效性验证;我遇到了令我困惑的问题
这是生成 UUID 的代码(在 mongodb 上下文中):
import java.util.UUID;
... ...
Document setOnInsert = new Document(Params.sender, UUID.randomUUID())
.append(Params.userDevice, userDevice)
.append(Params.hostId,"");
这是一个验证UUID的代码;我从这个帖子中复制了正则表达式。
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();
}
}
以下是我遇到问题的两个UUID。
aa4aaa2c-c6ca-d5f5-b8b2-0b5c78ee2cb7
b24dd64c-de6b-5bf6-6283-aa2167cc93a7
这两个UUID是由上述代码生成的;在我的最新调试中,验证方法(isUUID())判断它们无效;但我将这些UUID发布到验证器在线进行验证,它说是可以的。
这是我的系统信息。
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是正确的还是错误的?应该相信生成器还是验证器?
UUID.fromString()
- wvdz[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}
。第一个字母应该是1-5而不是"d",第二个字母应该是8-b而不是6。 - Jon SkeethexOctet
(每个都是两个十六进制数字)组成。您比规范更加限制了它。请信任内置生成器,不要相信“在互联网上找到”的验证器。 - Amadan