BITMAP_HASH
Описание
Вычисляет 32-битное хеш-значение входных данных любого типа и возвращает Bitmap, содержащий это хеш-значение.
Синтаксис
BITMAP_HASH(<expr>)
Параметры
| Параметр | Описание |
|---|---|
<expr> | Любое значение или выражение с полями |
Возвращаемое значение
Возвращает Bitmap, содержащий 32-битное хеш-значение параметра <expr>.
- Если параметр имеет значение NULL, возвращается пустой Bitmap
::: note
Используемый алгоритм хеширования: MurMur3. MurMur3 представляет собой высокопроизводительный алгоритм хеширования с низкой вероятностью коллизий, который формирует значения с распределением, близким к случайному, и может проходить проверки по критерию хи-квадрат. Обратите внимание, что вычисленные хеш-значения могут различаться в зависимости от аппаратной платформы и начальных значений. Подробнее о производительности этого алгоритма см. в результатах тестирования Smhasher.
:::
Примеры
Для вычисления хеша MurMur3 для значения можно использовать:
select bitmap_to_array(bitmap_hash('hello'))[1];
Результат будет следующим:
+-------------------------------------------------------------+
| %element_extract%(bitmap_to_array(bitmap_hash('hello')), 1) |
+-------------------------------------------------------------+
| 1321743225 |
+-------------------------------------------------------------+
Для подсчёта уникальных значений в столбце можно использовать Bitmap, что в некоторых сценариях эффективнее, чем count distinct. В приведённом ниже примере таблица words заполняется 6 строками, содержащими 4 уникальных значения; в масштабах корпуса документов реальный запрос такого вида может возвращать значения, исчисляемые миллионами:
CREATE TABLE `words` (`word` VARCHAR(64))
DISTRIBUTED BY HASH(`word`) BUCKETS 1
PROPERTIES ("replication_num" = "1");
INSERT INTO `words` VALUES ('apple'), ('banana'), ('cherry'), ('apple'), ('date'), ('banana');
select bitmap_count(bitmap_union(bitmap_hash(`word`))) from `words`;
+-------------------------------------------------+
| bitmap_count(bitmap_union(bitmap_hash(`word`))) |
+-------------------------------------------------+
| 4 |
+-------------------------------------------------+
select bitmap_to_string(bitmap_hash(NULL)) AS res;
Результат будет следующим:
+------+
| res |
+------+
| |
+------+