Какой хэш-алгоритм используется для встроенной функции Hive HASH()
какой алгоритм хэширования используется во встроенной функции HASH ()?
Я идеально ищу хэш SHA512/SHA256, подобный тому, что функция SHA() предлагает в LinkedIn datafu UDFs для Pig.
2 ответов
HASH
функция (начиная с Hive 0.11) использует алгоритм, подобный java.утиль.Список#хэш-код.
его код выглядит так:
int hashCode = 0; // Hive HASH uses 0 as the seed, List#hashCode uses 1. I don't know why.
for (Object item: items) {
hashCode = hashCode * 31 + (item == null ? 0 : item.hashCode());
}
в основном это классический алгоритм хэша, как рекомендовано в книге Effective Java. Цитируя великого человека (и великого книги):
значение 31 было выбрано, потому что это нечетное простое число. Если бы это было так ... и умножение переполнится, информация будет потеряна, так как умножение на 2 эквивалентно сдвигу. Преимущество использования Прайм менее ясен, но он традиционный. Хороший отель на 31 это что умножение может быть заменено сдвигом и вычитанием для лучшей производительности: 31 * i = = (i
я отвлекся. Вы можете посмотреть на HASH
источник здесь.
если вы хотите использовать SHAxxx в Hive, вы можете использовать Apache DigestUtils класс и Улей встроенный
по состоянию на куст 2.1.0 есть mask_hash
функция, которая будет хэшировать строковые значения.
Для Hive 2.x он использует md5 в качестве алгоритма хэширования. Это было изменено на sha256 для Hive 3.x