Как уменьшить длину UUID, сгенерированного с использованием randomUUID()

У меня есть короткая утилита, в которой я генерирую UUID с использованием randomUUID().

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

Однако генерируемый uuid слишком длинный, длина которого 36.

В любом случае я могу уменьшить длину UUID от 36 до почти 16 или 16?

Ответы

Ответ 1

Если вам не нужно, чтобы он был уникальным, вы можете использовать любую нужную вам длину.

Например, вы можете сделать это.

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);

Это даст вам почти такую ​​же степень случайности, но будет использовать все возможные символы между \u0000 и \ufffd

Если вам нужны печатные символы ASCII, вы можете сделать их такими короткими, как вам нравится, но вероятность уникальности значительно падает. Что может сделать, так это использовать базу 36 вместо базы 16

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

Это будет 26 символов в среднем, максимум 27 символов.

Вы можете использовать кодировку base64 и уменьшить ее до 22 символов.

Если вы используете base94, вы можете получить его до 20 символов.

Если вы используете весь диапазон допустимых символов от \u0000 до\ufffd, вы можете уменьшить его до 9 символов или 17 байт.

Если вам не нужны строки, вы можете использовать 16, 8-битные байты.

Ответ 2

String uuid = String.format("% 040d", новый BigInteger (UUID.randomUUID(). ToString(). Replace ("-", ""), 16));

Строка uuid16digits = uuid.substring(uuid.length() - 16);

Это вернет последние 16 цифр фактического uuid.

Ответ 3

Да, вы можете создать эту функцию.

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