web-dev-qa-db-fra.com

UUID.randomUUID () vs SecureRandom

J'essaie de comprendre les avantages de l'utilisation de UUID.randomUUID () sur le générateur SecureRandom car le premier utilise securerandom en interne.

16
User3518958

Eh bien, le code source montre UUID.randomUUID utilise SecureRandom .

public static UUID  [More ...] randomUUID() {
    SecureRandom ng = numberGenerator;
    if (ng == null) {
        numberGenerator = ng = new SecureRandom();
    }
    byte[] randomBytes = new byte[16];
    ng.nextBytes(randomBytes);
    randomBytes[6]  &= 0x0f;  /* clear version        */
    randomBytes[6]  |= 0x40;  /* set to version 4     */
    randomBytes[8]  &= 0x3f;  /* clear variant        */
    randomBytes[8]  |= 0x80;  /* set to IETF variant  */
    return new UUID(randomBytes);
}

Comme vous pouvez le voir, vous pouvez utiliser l'un ou l'autre, mais dans un UUID sécurisé, vous avez 6 bits non aléatoires, ce qui peut être considéré comme un inconvénient si vous êtes pointilleux.

24
uoyilmaz

Les nombres aléatoires ont une chance aléatoire d'être répétés. Plus le caractère aléatoire est faible (sauf en cas de coordination), plus les chances de produire deux fois le même nombre sont grandes.

https://en.wikipedia.org/wiki/Birthday_problem
.

SecureRandom vous permet de choisir le nombre d'aléas que vous souhaitez. Faites-le trop petit et il y a de fortes chances qu'ils soient répétés. Vous pouvez obtenir un identifiant aléatoire 32 bits en double en une fraction de seconde.

UUID définit la norme à 128 bits (ou comme le souligne uoyilmaz, 122 bits sont aléatoires). Cela suffit pour la plupart des cas d'utilisation. Cependant, si vous voulez une chaîne aléatoire, je serais tenté d'utiliser plus de bits et/ou une base supérieure à 16. Java par exemple, supporte les bases 36 et 64, ce qui signifie que vous pouvez avoir des identifiants plus courts, ou plus aléatoire pour le même ID de longueur.

Remarque: le format UUID a plusieurs - dans son vidage même si je ne vois pas leur valeur, ils allongent simplement la chaîne.

6
Peter Lawrey