JUG — это набор Java-классов для работы с UUID: генерация UUID любыми стандартными методами, эффективный вывод, сортировка и так далее. Он генерирует UUID в соответствии со спецификацией UUID (RFC-4122) (дополнительные объяснения см. на странице UUID в Википедии).
JUG был написан Тату Салоранта ([email protected]) первоначально в 2002 году и с годами обновлялся. Кроме того, многие другие люди помогли исправить ошибки и реализовать новые функции: полный список см. release-notes/CREDITS
.
JUG распространяется по лицензии Apache License 2.0.
JUG поддерживает обе «классические» версии, определенные в RFC 4122]:
1
: на основе времени/места3
и 5
: на основе хеша имени4
: на основе случайных чисели новые (в 2022-2024 гг.) предложенные (см. uuid6 и RFC-4122 bis) варианты:
6
: переупорядоченный вариант версии 1
(с лексикографическим упорядочением)7
: Unix-метка времени + случайный вариант (также с лексикографическим упорядочением) Тип | Статус |
---|---|
Сборка (CI) | |
Артефакт | |
Спонсорство ОСС | |
Javaдокументация | |
Покрытие кода (5.x) | |
Оценка OpenSSF |
JUG можно использовать как инструмент командной строки (через класс com.fasterxml.uuid.Jug
) или как подключаемый компонент.
Координаты Maven:
< dependency >
< groupId >com.fasterxml.uuid</ groupId >
< artifactId >java-uuid-generator</ artifactId >
< version >5.1.0</ version >
</ dependency >
Градл:
implementation ' com.fasterxml.uuid:java-uuid-generator:5.1.0 '
Единственная зависимость для JUG — это библиотека журналирования:
log4j
(зависит от времени выполнения).slf4j
: реализация журналирования предоставляется вызывающим приложением. Начиная с версии 3.2.0
, JUG определяет совместимый с JDK9+ module-info.class
с именем модуля com.fasterxml.uuid
.
Для прямой загрузки посетите Project Wiki.
Исходным вариантом использования JUG было создание значений UUID. Для этого сначала выбирается тип используемого генератора, а затем вызывается его generate()
. Например:
UUID uuid = Generators . timeBasedGenerator (). generate (); // Version 1
UUID uuid = Generators . randomBasedGenerator (). generate (); // Version 4
UUID uuid = Generators . nameBasedgenerator (). generate ( "string to hash" ); // Version 5
// With JUG 4.1+: support for https://github.com/uuid6/uuid6-ietf-draft versions 6 and 7:
UUID uuid = Generators . timeBasedReorderedGenerator (). generate (); // Version 6
UUID uuid = Generators . timeBasedEpochGenerator (). generate (); // Version 7
// With JUG 5.0 added variation:
UUID uuid = Generators . timeBasedEpochRandomGenerator (). generate (); // Version 7 with per-call random values
Если вы хотите настроить генераторы, вы также можете просто сохранить экземпляр генератора:
TimeBasedGenerator gen = Generators . timeBasedGenerator ( EthernetAddress . fromInterface ());
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
Если на вашем компьютере установлена стандартная настройка IP-сети, фабричный метод Generators.defaultTimeBasedGenerator
(добавленный в JUG 4.2) попытается определить, какой сетевой интерфейс соответствует маршруту по умолчанию для всего исходящего сетевого трафика, и использовать его для создания генератора на основе времени. Вероятно, это хороший выбор для распространенных сценариев использования, если вам нужен генератор UUID версии 1.
TimeBasedGenerator gen = Generators . defaultTimeBasedGenerator ();
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
Генераторы полностью потокобезопасны, поэтому один экземпляр может использоваться несколькими потоками.
Javadocs для получения дополнительной информации можно найти в Project Wiki.
java.util.UUID
в byte[] Иногда вам может потребоваться преобразовать java.util.UUID
во внешнюю сериализацию: например, в виде String
или массивов байтов ( byte[]
). Преобразование в String
легко осуществляется с помощью UUID.toString()
(предоставляется JDK), но аналогичной функции для преобразования в byte[]
не существует.
Но класс UUIDUtil
предоставляет методы для эффективных преобразований:
byte[] asBytes = UUIDUtil.asByteArray(uuid);
// or if you have longer buffer already
byte[] outputBuffer = new byte[1000];
// append at position #100
UUIDUtil.toByteArray(uuid, outputBuffer, 100);
java.util.UUID
из String, byte[] Значения UUID
часто передаются как java String
или byte[]
(массивы байтов), и для получения фактических экземпляров java.util.UUID
необходимо преобразование. JUG имеет оптимизированные функции преобразования, доступные через класс UUIDUtil
(пакет com.fasterxml.uuid.impl
), который используется следующим образом:
UUID uuidFromStr = UUIDUtil.uuid("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
byte[] rawUuidBytes = ...; // byte array with 16 bytes
UUID uuidFromBytes = UUIDUtil.uuid(rawUuidBytes)
Обратите внимание, что JDK имеет функцию создания UUID
из String
, например:
UUID uuidFromStr = UUID.fromString("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
это немного медленнее, чем версия JUG: для получения дополнительной информации прочтите Измерение производительности Java UUID.fromString().
JUG jar, построенный под target/
:
target/java-uuid-generator-5.1.0-SNAPSHOT.jar
также может использоваться как простой инструмент для генерации UUID из командной строки.
Чтобы увидеть использование, вы можете сделать что-то вроде:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar
и получите полные инструкции, но для генерации 5 случайных UUID вам следует использовать:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar -c 5 r
(где -c
(или --count
) означает количество генерируемых UUID, а r
означает случайную версию)
ПРИМЕЧАНИЕ. эта функциональность включена в JUG 4.1 — в более ранних версиях вам потребуется немного более длительный вызов, поскольку в метаданных Jar не указан «Main-Class». Если это так, вам нужно будет использовать
java -cp target/java-uuid-generator-5.1.0-SNAPSHOT.jar com.fasterxml.uuid.Jug -c 5 r
JUG версий 3.1 и более поздних версий требует для работы JDK 1.6, в основном для доступа к локальному MAC-адресу Ethernet. Более ранние версии (3.0 и ранее) работали с версией 1.4 (в которой появился java.util.UUID
).
Для работы JUG версии 5.0 и более поздних версий требуется JDK 8.
java.util.UUID
JDK имеет некорректную реализацию метода compareTo()
, который использует наивное сравнение 64-битных значений. Это НЕ работает должным образом, учитывая, что базовый контент практически не подписан. Например, два UUID:
7f905a0b-bb6e-11e3-9e8f-000000000000
8028f08c-bb6e-11e3-9e8f-000000000000
будет упорядочен со вторым первым из-за расширения знака (второе значение считается отрицательным и, следовательно, «меньшим»).
По этой причине вам всегда следует использовать внешний компаратор, например com.fasterxml.uuid.UUIDComparator
, который реализует ожидаемый порядок сортировки, который представляет собой простую беззнаковую сортировку, которая также аналогична лексикографической (алфавитной) сортировке UUID (при условии равномерного использования заглавных букв). .
Доступно как часть подписки Tidelift.
Разработчики java-uuid-generator
и тысяч других пакетов работают с Tidelift, чтобы обеспечить коммерческую поддержку и обслуживание зависимостей с открытым исходным кодом, которые вы используете для создания своих приложений. Экономьте время, снижайте риски и улучшайте работоспособность кода, платя при этом специалистам по сопровождению именно тех зависимостей, которые вы используете. Узнать больше.
Для простых отчетов об ошибках и исправлений, а также запросов на добавление функций просто используйте систему отслеживания проблем проектов, за исключением проблем, связанных с безопасностью, для которых мы рекомендуем обращаться в службу безопасности Tidelift (ПРИМЕЧАНИЕ: для этого НЕ обязательно быть подписчиком).
Существует множество других общедоступных генераторов UUID. Например:
java.util.UUID
начиная с версии 1.4, но не включает методы генерации (особенно методы, основанные на времени/местоположении), имеет нестандартную производительность для многих операций и бесполезно реализует сравнение.Обратите внимание: хотя некоторые пакеты утверждают, что они быстрее других, это неясно:
поэтому зачастую лучше выбирать, исходя из стабильности пакетов и API.