2017-01-19 6 views
2

Я генерирую UUID и применяю их к Regex в своем коде; Я просто столкнулся с проблемами, которые путают меняЧто такое действительный UUID?

Вот код, который генерирует UUID, (в контексте MongoDB)

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

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

Это код проверки правильности UUID; Я скопировал Regex из этого 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, и он говорит, что нормально

Это моя система информации

[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-б. –

+5

[RFC 4122] (https://tools.ietf.org/html/rfc4122) не имеет таких ограничений для первой шестнадцатеричной цифры этих групп, он просто говорит, что группа состоит из двух «hexOctet» (это две шестнадцатеричные цифры каждый). Вы ограничиваете его больше, чем это делает спецификация. Доверяйте встроенному генератору, не доверяйте валидатору «нашли где-нибудь в Интернете». – Amadan

ответ

4

Вы можете использовать UUID.randomUUID(), который сгенерирует действительный UUID, вам не нужен regx.

+0

благодарю за то, что вы доверили генератору , ну, сценарий заключается в том, что UUID были сгенерированы, но не были уничтожены и истекли сразу; вместо этого они могут жить довольно долго, могут быть сохранены, скопированы и переданы. так что это предосторожность перед любым исключением перед использованием –

+0

@Jobin: мы не видим, где вызывается 'isUUID', и вопрос уже содержит' UUID.randomUUID() '. Регулярное выражение просто использовалось для проверки ввода, поэтому его можно использовать. – Roland

+2

Я не думаю, что ему нужно проверить UUID, который сгенерирован с использованием 'UUID.randomUUID()' (вернет действительный 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,.

Примечание БЕЗОПАСНОСТИ:

Статический завод для извлечения типа 4 (псевдо генерируется случайным образом) UUID. идентификатор UUID генерируется с использованием криптографически сильных псевдо генератора случайных чисел

3

мое предложение, не изобретать колесо.

В принципе, если вы создаете идентификаторы с UUID.randomUUID(), нет необходимости проверять их. Если вам это интересно, то ими можно манипулировать вручную. Вы можете просто использовать UUID.fromString(yourUUID) и поймать IllegalArgumentExcepetion и NumberFormatException, которые могут быть выброшены.

Броски IllegalArgumentExcepetion:

Если имя не соответствует представлению строки, как описано в ToString()

Кроме того, вы можете проверить позади, если UUID был правильно преобразован с

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