什么是有效的UUID?

时间:2017-01-19 08:33:47

标签: java regex java-8 uuid

我生成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是正确还是错误?谁相信,发电机或验证

3 个答案:

答案 0 :(得分:5)

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

基本上,如果使用UUID.randomUUID()生成ID,则无需验证它们。 如果您对他们可能会被手动操作感到好奇。 您可以使用UUID.fromString(yourUUID)并抓住可能被引发的IllegalArgumentExcepetionNumberFormatException

抛出IllegalArgumentExcepetion

  

如果name不符合toString()

中描述的字符串表示

此外,如果使用

正确转换了UUID,您可以在后面查看
UUID id = UUID.fromString(yourUUID);
if(id.toString().equals(yourUUID){
    //success
}

答案 1 :(得分:4)

你可以使用生成有效UUID的$> git clone <url/to/your/git/repository>,你不需要regx。

答案 2 :(得分:0)

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

package foobar;

import java.util.regex.Pattern;

public class FooBar {
  private static final Pattern pattern = Pattern
      .compile("(?i)^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-5][0-9a-f]{3}-?[089ab][0-9a-f]{3}-?[0-9a-f]{12}$");

  private static final boolean isValidUuid(final String uuid) {
    return ((uuid != null) && (uuid.trim().length() > 31)) ? pattern.matcher(uuid).matches() : false;
  }

  public static void main(final String[] args) {
    System.out.println(isValidUuid("628e8331-864c-4b25-be55-ca76c3a7aa94")); // true
    System.out.println(isValidUuid("628E8331-864C-4b25-BE55-ca76c3a7aa94")); // true
    System.out.println(isValidUuid("628e8331864c4b25be55ca76c3a7aa94")); // true
    System.out.println(isValidUuid("00000000-0000-0000-0000-000000000000")); // true
    System.out.println(isValidUuid("g28e8331-864z-4b25-ty55-wv76c3g7yt94")); // false
    System.out.println(isValidUuid("g28e8331-864z-4b25-ty55-wv76c3g7yt945")); // false
    System.out.println(isValidUuid("")); // false
    System.out.println(isValidUuid(null)); // false
  }
}

要尝试更多UUID,请使用UUID.randomUUID()或在线: https://www.uuidgenerator.net/version4

注意:UUID.randomUUID()的Java可以正常使用how good is java's UUID.randomUUID?,此代码仅对验证外部UUID有用。

安全注意:

  

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