java.util.UUID.fromString没有检查长度

Adr*_*n M 15 java

当我查看实现时java.util.UUID.fromString,我发现它没有检查UUID长度.这有什么特别的原因吗?它仅检查由" - "分隔的组件.

String[] components = name.split("-");
        if (components.length != 5)
            throw new IllegalArgumentException("Invalid UUID string: "+name);
Run Code Online (Sandbox Code Playgroud)

当长度不是36时,它是否也会抛出IllegalArgumentException?

目前,如果没有长度检查,如果小于组件长度,则数字会自动添加0,如果更多,则会自动移位.缺点是,如果输入一个缺少数字的UUID字符串,它将被接受为有效并且前缀为0.这很难调试.

例如,"12345678-1234-1234-1234-123456789ab"变为"12345678-1234-1234-1234-0123456789ab".注意添加了'0'?并且"12345678-1234-1234-1234-123456789abcd"变为"12345678-1234-1234-1234-23456789abcd"并删除了"1".

为了进一步推动这一点,字符串"1-2-3-4-5"也将被视为有效并变为"00000001-0002-0003-0004-000000000005".

编辑:为了澄清我的问题,这是一个错误或有意遵循某些标准或原则吗?

Jon*_*oni 15

只有UUID类的原作者可以告诉你为什么他们选择不检查fromString方法中的组件长度,但我怀疑他们是在试图注意Postel定律:

你所接受的是自由的,你所发送的是保守的.

您始终可以针对正则表达式检查输入,如下所示:

[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}
Run Code Online (Sandbox Code Playgroud)


ams*_*ams 12

UUID.fromString的行为很奇怪我不确定它是否是一个bug,但这是我一直在做的,以捕获这些错误.

public class UUIDUtils {
    public static boolean isValid(String uuid){
        if( uuid == null) return false;
        try {
            // we have to convert to object and back to string because the built in fromString does not have 
            // good validation logic.
            UUID fromStringUUID = UUID.fromString(uuid);
            String toStringUUID = fromStringUUID.toString();
            return toStringUUID.equals(uuid);
        } catch(IllegalArgumentException e) {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)