Преобразовать строку во что-то обратимое, в Java
У меня есть много URL, которые служат ключами в таблице HBase. Так как они "все" начинают http://
, Hbase помещает их в один и тот же узел. Таким образом я заканчиваю с узлом в +100%, а другой бездействует.
Итак, мне нужно сопоставить URL с чем-то похожим на хэш, но обратимым. Есть ли простой, стандартный и быстрый способ сделать это в JAVA8.
Я ищу случайное (линейное) распределение префиксов.
Замечания:
изменение URL не интересно, так как многие URL заканчиваются
/ ? =
и риск разбалансировать распределение.Мне не нужно шифрование, но я могу принять его.
Я не смотрю на сжатие, но приветствуется, если это возможно:)
Спасибо, Костин
2 ответа
Там нет ни одного стандартного способа.
Одна вещь, которую вы можете сделать, это добавить префикс ключа к его хешу. Что-то вроде:
a01cc0fe http://...
Это легко обратимо (просто отрежьте хеш-символы, которые вы можете сделать фиксированной длины) и получите хорошее распределение.
Хеш-код для строки стабилен и согласован во всех JVM. Алгоритм вычисления указан в String.hashCode
документацию, так что вы можете считать ее частью договора о том, как работает строка.
Добавьте префикс хеш-кода, закодированного 36-значным десятичным числом [0-9a-z].
public static String encode(String s) {
return Integer.toString(s.hashCode() & 0xffffff, 36) + "#" + s;
}
public static String decode(String s) {
return s.replaceFirst("^[^#]*#", "");
}
образец:
http://google.com/ <-> 5o07l#http://google.com/