Какой хэш-алгоритм используется для встроенной функции 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