Если вы хотите, чтобы это было обратимо, у вас проблемы.Хеши предназначены , чтобы быть односторонними.
В частности, учитывая, что int
имеет 32 бита информации, а char
имеет 16 бит информации, что требует средств обратимостивы можете иметь только строки из нуля, одного или двух символов (и даже если вы предполагаете, что вы счастливы закодировать "" как "\ 0 \ 0" или что-то подобное).Конечно, если у вас нет хранилища.Если вы можете использовать хранилище, тогда просто сохраняйте числа последовательно ... что-то вроде:
private int stringToIntFunction(String uri) {
Integer existingId = storage.get(uri);
if (existingId != null) {
return existingId.intValue();
}
return storage.put(uri);
}
Здесь storage.put()
внутренне увеличит счетчик, сохранит URI как связанный с этим значением счетчика и вернет его,Я предполагаю, что это не то, что вам нужно.
По сути, для выполнения обратимого шифрования я бы использовал стандартную библиотеку шифрования, предварительно преобразовав строку в двоичный формат (например, используя UTF-8).).Я ожидал бы, что результат будет byte[]
.
Если бы он не не должен был быть обратимым, я бы подумал просто взять абсолютное значение нормального hashCode()
результата(но сопоставление Integer.MIN_VALUE
с чем-то конкретным, поскольку его абсолютное значение не может быть представлено как int
).