web-dev-qa-db-fra.com

comment réduire la longueur de l'UUID généré en utilisant randomUUID ()

J'ai un utilitaire court dans lequel je génère un UUID en utilisant randomUUID (). 

String uuid = UUID.randomUUID().toString();

Cependant, l'uuid généré est trop long, c'est-à-dire 36.

Est-il possible de réduire la longueur de l'UUID de 36 à 16 ou 16?

16
AppleBud

Si vous n'avez pas besoin qu'elle soit unique, vous pouvez utiliser la longueur de votre choix.

Par exemple, vous pouvez le faire.

Random Rand = new Random();
char[] chars = new char[16];
for(int i=0;i<chars.length;i++) {
    chars[i] = (char) Rand.nextInt(65536);
    if (!Character.isValidCodePoint(chars[i]))
        i--;
}
String s = new String(chars);

Cela vous donnera presque le même degré d’aléatoire mais utilisera tous les caractères possibles entre \u0000 et \ufffd

Si vous avez besoin de caractères imprimables ASCII, vous pouvez les rendre aussi courts que vous le souhaitez, mais la probabilité d'unicité diminue considérablement. Ce qui peut faire est d’utiliser la base 36 au lieu de la base 16

UUID uuid = UUID.randomUUID();
String s = Long.toString(uuid.getMostSignificantBits(), 36) + '-' + Long.toString(uuid.getLeastSignificantBits(), 36);

Cela fera 26 caractères en moyenne, au plus 27 caractères.

Vous pouvez utiliser le codage base64 et le réduire à 22 caractères.

Si vous utilisez base94, vous pouvez obtenir 20 caractères.

Si vous utilisez toute la gamme de caractères valides de\u0000 à\ufffd, vous pouvez la réduire à seulement 9 caractères ou 17 octets.

Si vous ne vous souciez pas de Strings, vous pouvez utiliser 16 octets sur 8 bits.

23
Peter Lawrey

Oui, vous pouvez créer en utilisant cette fonction.

public static String shortUUID() {
  UUID uuid = UUID.randomUUID();
  long l = ByteBuffer.wrap(uuid.toString().getBytes()).getLong();
  return Long.toString(l, Character.MAX_RADIX);
}
0
Pritam Panja