Solución:
Si no necesita que sea único, puede usar la longitud que desee.
Por ejemplo, puedes hacer esto.
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);
Esto le dará casi el mismo grado de aleatoriedad pero utilizará todos los caracteres posibles entre u0000
y ufffd
Si necesita caracteres ASCII imprimibles, puede hacerlo tan corto como desee, pero la probabilidad de unicidad disminuye significativamente. Lo que puedo hacer es usar la base 36 en lugar de la base 16
UUID uuid = UUID.randomUUID();
String s = Long.toString(uuid.getMostSignificantBits(), 36) + '-' + Long.toString(uuid.getLeastSignificantBits(), 36);
Esto tendrá un promedio de 26 caracteres, como máximo 27 caracteres.
Puede utilizar la codificación base64 y reducirla a 22 caracteres.
Si usa base94, puede obtenerlo hasta 20 caracteres.
Si usa todo el rango de caracteres válidos de u0000 a ufffd, puede reducirlo a solo 9 caracteres o 17 bytes.
Si no le importan las cadenas, puede usar 16 bytes de 8 bits.