2017-01-19 78 views
2

我生成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,和它說OK

這是我的系統信息

[email protected]:~$ 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) 
[email protected]:~$ 
[email protected]:~$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 16.04.1 LTS 
Release: 16.04 
Codename: xenial 
[email protected]:~$ 

一些背景:我一直在努力在JDK 1.8.0_111;這些UUID已經生成,並且沒有問題。然後我今天升級到1.8.0_121,並遇到這個問題...

所以我的問題是:上述UUID是否正確或錯誤?誰相信,發電機或驗證

+4

爲什麼不直接使用UUID類來驗證它們? ''UUID.fromString()' – wvdz

+5

問題出現在模式的這一部分:'[1-5] [0-9a-f] {3} - [89ab] [0-9a-f] {3}' 。在第一個你有一個「D」你應該有1-5;在第二個中你有6個,你應該有8-b。 –

+5

[RFC 4122](https://tools.ietf.org/html/rfc4122)對這些組的第一個十六進制數字沒有這樣的限制,它只是說組包含兩個'hexOctet'(它是兩個十六進制數字每)。您比規範限制更多。信任內置的發生器,不信任「在互聯網上的某處發現」驗證器。 – Amadan

回答

4

您可以使用UUID.randomUUID()這將生成一個有效的UUID,你不需要雷克斯。

+0

感謝給我對發電機的信心。那麼,情景是UUID是生成的,但沒有被消耗,並立即過期;相反,他們可能會活很長一段時間,可能會被保存,複製和傳播。所以這是在使用 –

+0

之前防止出現異常@Jobin:我們看不到'isUUID'被調用的地方,並且問題已經包含'UUID.randomUUID()'。正則表達式只是用來驗證輸入,所以可以使用它。 – Roland

+2

我不認爲他需要驗證使用UUID.randomUUID()生成的UUID(將返回一個有效的uuid) – Jobin

0

看了一下其他一些SO答案,其他語言...,這裏是一個純Java的解決方案,處理V4的情況下(如在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()將工作做好看how good is java's UUID.randomUUID?,這段代碼是驗證外部的UUID纔有用。

SECURITY注:

靜態工廠檢索類型4(僞隨機生成的)UUID。 的UUID使用加密強僞隨機 數發生器

3

我的建議是生成,不會推倒重來。

基本上,如果您生成UUID.randomUUID()的ID,則無需驗證它們。 如果您無論如何都好奇,他們可能會被手動操縱。 您可以使用UUID.fromString(yourUUID)並捕獲可能拋出的IllegalArgumentExcepetionNumberFormatException

拋出IllegalArgumentExcepetion

如果名稱不符合(),如的toString描述的字符串表示

此外,您可以檢查的背後,如果UUID得到了與

正確轉換
UUID id = UUID.fromString(yourUUID); 
if(id.toString().equals(yourUUID){ 
    //success 
}