Update:
Нет необходимости использовать Hashids. Базы 36 достаточно хороши.
long id = 12345;
String hash = Integer.toString(Math.abs((int)id), 36);
Оригинальный ответ, с Hashids:
Вы можете использовать Hashids
long id = 12345;
Hashids hashids = new Hashids("this is my salt");
String hash = hashids.encrypt(id); // "ryBo"
"ryBo"
собирается быть уникальным, так как он может быть преобразован обратно в ваш длинный. Hashids
просто преобразует, не hash далее.
long[] numbers = hashids.decrypt("ryBo");
// numbers[0] == 12345
Если у вас действительно есть 64-битное значение, хэш-строка будет довольно долго (около 16 символов, в зависимости от алфавита), но если вы не планируете иметь больше чем 2^16 штук, вы можете уйти с усечением 64-битного хэша до 32-битного (int).
long id = 12345;
String hash = hashids.encrypt(Math.abs((int)id));
Если это уникально, то это не хэш в нормальном смысле слова. –
Вам действительно нужна абсолютно нулевая вероятность получить один и тот же хеш для разных значений или достаточно низкая вероятность? –
Длительное значение - это значение хэша. длинные значения будут иметь каждую цифру в диапазоне (0-9). Это подмножество ваших требований; так что успех! – DwB