Перейти к содержимому
Последнее обновление

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 |
+------+
| |
+------+