Преобразовать строку во что-то обратимое, в 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/
Другие вопросы по тегам