UUID en Java

java.util.UUID

Le JDK a une classe java.util.UUID depuis la version 5 en 2004. L’interface publique de cette classe n’a pas changé entre le JDK 5 et 21 en 2023.

  • UUID

    • + randomUUID(): UUID

    • + nameUUIDFromBytes(byte[] name): UUID

    • + fromString(String name): UUID

    • + version(): int

    • + variant(): int

    • + timestamp(): long

    • + clockSequence(): int

    • + node(): long

    • + getMostSignificantBits(): long

    • + getLeastSignificantBits(): long

Les méthodes statiques permettent de générer des UUIDs, avec des capacités limitées à la version 4 (UUID.randomUUID()) et la version 3 (UUID.nameUUIDFromBytes(name.getBytes())). Il n’y a rien pour les versions 1 ou 5. Il n’y a rien non plus pour les versions 6 à 8, trop récentes pour le JDK 21.

La méthode fromString(…​) permet de créer une instance d’UUID à partir d’une chaîne de caractères. Elle ne se préoccupe pas de la version et ne vérifie pas le contenu. Il faut juste que le texte respecte le format UUID. Ça permet de charger des UUIDs générés par ailleurs.

Les méthodes timestamp(), clockSequence() et node() ne fonctionnent qu’avec des UUID v1. Pour les autres versions, elles lèvent une UnsupportedOperationException.

Pour les autres versions, on peut utiliser des librairies tierces.

Java UUID Generator

java-uuid-generator, aka JUG, supporte les versions 1, 2, 3, 4, 5, 6 et 7.

  <dependency>
    <groupId>com.fasterxml.uuid</groupId>
    <artifactId>java-uuid-generator</artifactId>
    <version>5.0.0</version>
  </dependency>

UUID v1

// based on preferred MAC address
TimeBasedGenerator generatorV1 = Generators.timeBasedGenerator(EthernetAddress.fromPreferredInterface());
UUID idV1 = generatorV1.generate();

// based on random multicast address
TimeBasedGenerator generatorV1Random = Generators.timeBasedGenerator();
UUID idV1Random = generatorV1Random.generate();

UUID v3

NameBasedGenerator generatorV3 = Generators.nameBasedGenerator(null, MessageDigest.getInstance("MD5"));
UUID idV3 = generatorV3.generate("JTips");

UUID v4

// based on SecureRandom
RandomBasedGenerator generatorV4 = Generators.randomBasedGenerator();
UUID idV4 = generatorV4.generate();

UUID v5

RandomBasedGenerator generatorV5 = Generators.NameBasedGenerator();
UUID idV5 = generatorV5.generate("JTips");

UUID v6

TimeBasedReorderedGenerator generatorV6 = Generators.timeBasedReorderedGenerator();
UUID idV6 = generatorV6.generate();

UUID v7

TimeBasedEpochGenerator generatorV5 = Generators.timeBasedEpochGenerator();
UUID idV7 = generatorV7.generate( );

UUID Creator

<dependency>
  <groupId>com.github.f4b6a3</groupId>
  <artifactId>uuid-creator</artifactId>
  <version>5.3.7</version>
</dependency>

UUID v1

// based on preferred MAC address
UUID idV1 = UuidCreator.getTimeBasedWithMac();

// based on random multicast address
UUID idV1Random = UuidCreator.getTimeBasedWithRandom();

UUID v3

UUID idV3 = UuidCreator.getNameBasedMd5("JTips");

UUID v4

// based on Random
UUID idV4 = UuidCreator.getRandomBased();

UUID v5

UUID idV5 = UuidCreator.getNameBasedSha1("JTips");

UUID v6

UUID idV6 = UuidCreator.getTimeOrdered();

UUID v7

UUID idV7 = UuidCreator.getTimeOrderedEpoch();