Есть ли способ генерировать случайный UUID, который состоит только из чисел?

класс UUID Java генерирует случайный UUID. Но она состоит из алфавитов и цифр. Для некоторых приложений нужны только цифры. Есть ли способ генерировать случайный UUID, который состоит только из чисел в Java ?

UUID.randomUUID();

9 ответов


Если вы не хотите случайное число, но UUID с номерами только использовать:

String lUUID = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16));

в этом случае осталось проложено до 40 нулей...

результаты:
UUID: b55081fa-9cd1-48c2-95d4-efe2db322a54
в:
UUID: 0241008287272164729465721528295504357972


почему бы просто не создать Random количество и положить его в формат, который вы хотите?

Это не даст вам уникальность из коробки. (т. е. вам придется реализовать проверку каждого поколения и повторить логику)

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


хотя оригинальный плакат этого вопроса обозначил вопрос @Jigar Joshi как лучший ответ, я хотел бы добавить, что в некоторых случаях есть обоснование использования UUIDs, а не случайных чисел. Разница в том, что UUID (универсально) уникальны (отсюда и название), а случайные числа-нет. Это просто вопрос вероятности, получаете ли вы одно и то же число дважды или даже чаще при генерации случайных чисел, но это никогда не произойдет с UUIDs. Поэтому, я считаю Ответ @ Chris Eibl как лучший.


UUID uuid = UUID.randomUUID();
String numericUUID = Long.toString(uuid.getMostSignificantBits())
                   + Long.toString(uuid.getLeastSignificantBits());

для записи: UUIDs на самом деле 128-битные числа.

то, что вы видите как буквенно-цифровую строку, - это представление этого 128-битного числа с использованием шестнадцатеричных цифр (0..9А..Ф.)

реальным решением является преобразование строки в соответствующее 128-битное число. И для хранения этого вам понадобятся два Лонга (Long имеет 64 бит).


зачем использовать класс UUID, если вам не нужен UUID? Это больше похоже на то, что вам нужно просто случайное число, которое может быть достигнуто с помощью java.util.Random класса.


Random не является глобально уникальным. Если вы хотите использовать UUIDs в противоположность Random класс как было предложено другими, вы можете просто использовать регулярное выражение, чтобы удалить все, кроме цифр из UUID. Попробуйте что-нибудь подобное,

String id = UUID.randomUUID().toString().replaceAll("[^0-9]", "");


вызов hashCode() на UUID, чтобы получить уникальное целое число.


строка uuid = UUID.randomUUID().toString ().заменяет("-", ""); // полоски' -'