2020-03-20 18:20:59 +00:00
# Функции хэширования {#funktsii-kheshirovaniia}
2017-03-12 17:58:51 +00:00
2017-10-25 05:27:09 +00:00
Функции хэширования могут использоваться для детерминированного псевдослучайного разбрасывания элементов.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## halfMD5 {#hash-functions-halfmd5}
2017-03-12 17:58:51 +00:00
2019-07-25 10:14:04 +00:00
[Интерпретирует ](../../query_language/functions/type_conversion_functions.md#type_conversion_functions-reinterpretAsString ) все входные параметры как строки и вычисляет хэш [MD5 ](https://ru.wikipedia.org/wiki/MD5 ) для каждой из них. Затем объединяет хэши, берет первые 8 байт хэша результирующей строки и интерпретирует их как значение типа `UInt64` с big-endian порядком байтов.
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
halfMD5(par1, ...)
```
Функция относительно медленная (5 миллионов коротких строк в секунду на ядро процессора).
По возможности, используйте функцию [sipHash64 ](#hash_functions-siphash64 ) вместо неё.
**Параметры**
Функция принимает переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
Значение хэша с типом данных [UInt64 ](../../data_types/int_uint.md ).
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT halfMD5(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS halfMD5hash, toTypeName(halfMD5hash) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌────────halfMD5hash─┬─type───┐
│ 186182704141653334 │ UInt64 │
└────────────────────┴────────┘
```
2020-03-22 09:14:59 +00:00
## MD5 {#hash_functions-md5}
2017-10-25 05:27:09 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет MD5 от строки и возвращает полученный набор байт в виде FixedString(16).
Если вам не нужен конкретно MD5, а нужен неплохой криптографический 128-битный хэш, то используйте вместо этого функцию sipHash128.
Если вы хотите получить такой же результат, как выдаёт утилита md5sum, напишите lower(hex(MD5(s))).
2020-03-22 09:14:59 +00:00
## sipHash64 {#hash_functions-siphash64}
2019-07-25 10:14:04 +00:00
Генерирует 64-х битное значение [SipHash ](https://131002.net/siphash/ ).
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
sipHash64(par1,...)
```
Это криптографическая хэш-функция. Она работает по крайней мере в три раза быстрее, чем функция [MD5 ](#hash_functions-md5 ).
Функция [интерпретирует ](../../query_language/functions/type_conversion_functions.md#type_conversion_functions-reinterpretAsString ) все входные параметры как строки и вычисляет хэш MD5 для каждой из них. Затем комбинирует хэши по следующему алгоритму.
2020-03-20 18:20:59 +00:00
1. После хэширования всех входных параметров функция получает массив хэшей.
2. Функция принимает первый и второй элементы и вычисляет хэш для массива из них.
3. Затем функция принимает хэш-значение, вычисленное на предыдущем шаге, и третий элемент исходного хэш-массива, и вычисляет хэш для массива из них.
4. Предыдущий шаг повторяется для всех остальных элементов исходного хэш-массива.
2019-07-25 10:14:04 +00:00
**Параметры**
Функция принимает переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
Значение хэша с типом данных [UInt64 ](../../data_types/int_uint.md ).
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT sipHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌──────────────SipHash─┬─type───┐
│ 13726873534472839665 │ UInt64 │
└──────────────────────┴────────┘
```
2017-03-12 17:58:51 +00:00
2020-03-22 09:14:59 +00:00
## sipHash128 {#hash_functions-siphash128}
2019-07-25 10:14:04 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет SipHash от строки.
Принимает аргумент типа String. Возвращает FixedString(16).
Отличается от sipHash64 тем, что финальный xor-folding состояния делается только до 128 бит.
2020-03-20 18:20:59 +00:00
## cityHash64 {#cityhash64}
2019-07-25 10:14:04 +00:00
Генерирует 64-х битное значение [CityHash ](https://github.com/google/cityhash ).
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
cityHash64(par1,...)
```
2020-03-20 18:20:59 +00:00
Это не криптографическая хэш-функция. Она использует CityHash алгоритм для строковых параметров и зависящую от реализации быструю некриптографическую хэш-функцию для параметров с другими типами данных. Функция использует комбинатор CityHash для получения конечных результатов.
2019-07-25 10:14:04 +00:00
**Параметры**
Функция принимает переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
Значение хэша с типом данных [UInt64 ](../../data_types/int_uint.md ).
**Примеры**
Пример вызова:
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT cityHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS CityHash, toTypeName(CityHash) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌─────────────CityHash─┬─type───┐
│ 12072650598913549138 │ UInt64 │
└──────────────────────┴────────┘
```
А вот так вы можете вычислить чексумму всей таблицы с точностью до порядка строк:
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT groupBitXor(cityHash64(*)) FROM table
```
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## intHash32 {#inthash32}
2019-07-25 10:14:04 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет 32-битный хэш-код от целого числа любого типа.
2019-08-23 10:55:34 +00:00
Это сравнительно быстрая не криптографическая хэш-функция среднего качества для чисел.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## intHash64 {#inthash64}
2019-07-25 10:14:04 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет 64-битный хэш-код от целого числа любого типа.
Работает быстрее, чем intHash32. Качество среднее.
2020-03-20 18:20:59 +00:00
## SHA1 {#sha1}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## SHA224 {#sha224}
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
## SHA256 {#sha256}
2019-07-25 10:14:04 +00:00
2017-03-12 17:58:51 +00:00
Вычисляет SHA-1, SHA-224, SHA-256 от строки и возвращает полученный набор байт в виде FixedString(20), FixedString(28), FixedString(32).
Функция работает достаточно медленно (SHA-1 - примерно 5 миллионов коротких строк в секунду на одном процессорном ядре, SHA-224 и SHA-256 - примерно 2.2 миллионов).
Рекомендуется использовать эти функции лишь в тех случаях, когда вам нужна конкретная хэш-функция и вы не можете её выбрать.
Даже в этих случаях, рекомендуется применять функцию оффлайн - заранее вычисляя значения при вставке в таблицу, вместо того, чтобы применять её при SELECT-а х .
2020-03-20 18:20:59 +00:00
## URLHash(url\[, N\]) {#urlhashurl-n}
2019-07-25 10:14:04 +00:00
2019-08-23 10:55:34 +00:00
Быстрая не криптографическая хэш-функция неплохого качества для строки, полученной из URL путём некоторой нормализации.
2019-07-25 10:14:04 +00:00
`URLHash(s)` - вычислить хэш от строки без одного завершающего символа `/` , `?` или `#` на конце, если там такой есть.
`URLHash(s, N)` - вычислить хэш от строки до N-г о уровня в иерархии URL, без одного завершающего символа `/` , `?` или `#` на конце, если там такой есть.
2017-03-12 17:58:51 +00:00
Уровни аналогичные URLHierarchy. Функция специфична для Яндекс.Метрики.
2018-10-16 10:47:17 +00:00
2020-03-20 18:20:59 +00:00
## farmHash64 {#farmhash64}
2019-07-25 10:14:04 +00:00
Генерирует 64-х битное значение [FarmHash ](https://github.com/google/farmhash ).
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
farmHash64(par1, ...)
```
2020-03-20 18:20:59 +00:00
Из всех [доступных методов ](https://github.com/google/farmhash/blob/master/src/farmhash.h ) функция использует `Hash64` .
2019-07-25 10:14:04 +00:00
**Параметры**
Функция принимает переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
Значение хэша с типом данных [UInt64 ](../../data_types/int_uint.md ).
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT farmHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS FarmHash, toTypeName(FarmHash) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌─────────────FarmHash─┬─type───┐
│ 17790458267262532859 │ UInt64 │
└──────────────────────┴────────┘
```
2020-03-22 09:14:59 +00:00
## javaHash {#hash_functions-javahash}
2019-07-25 10:14:04 +00:00
2019-09-23 10:48:21 +00:00
Вычисляет [JavaHash ](http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/String.java#l1452 ) от строки. `JavaHash` не отличается ни скоростью, ни качеством, поэтому эту функцию следует считать устаревшей. Используйте эту функцию, если вам необходимо получить значение хэша по такому же алгоритму.
2019-07-25 10:14:04 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-09-19 13:49:16 +00:00
SELECT javaHash('');
2019-09-19 12:31:03 +00:00
```
**Возвращаемое значение**
Хэш-значение типа `Int32` .
Тип: `javaHash` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-19 12:31:03 +00:00
SELECT javaHash('Hello, world!');
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-19 12:31:03 +00:00
┌─javaHash('Hello, world!')─┐
│ -1880044555 │
└───────────────────────────┘
```
2019-11-29 12:15:56 +00:00
## javaHashUTF16LE {#javahashutf16le}
2019-12-03 00:57:51 +00:00
Вычисляет [JavaHash ](http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/String.java#l1452 ) от строки, при допущении, что строка представлена в кодировке `UTF-16LE` .
2019-11-29 12:15:56 +00:00
2020-03-20 18:20:59 +00:00
**Синтаксис**
2019-11-29 12:15:56 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-11-29 12:15:56 +00:00
javaHashUTF16LE(stringUtf16le)
```
**Параметры**
2020-03-21 04:11:51 +00:00
- `stringUtf16le` — строка в `UTF-16LE` .
2019-11-29 12:15:56 +00:00
**Возвращаемое значение**
Хэш-значение типа `Int32` .
Тип: `javaHash` .
**Пример**
Верный запрос для строки кодированной в `UTF-16LE` .
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-11-29 12:15:56 +00:00
SELECT javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-11-29 12:15:56 +00:00
┌─javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))─┐
│ 3556498 │
└──────────────────────────────────────────────────────────────┘
```
2020-03-20 18:20:59 +00:00
## hiveHash {#hash-functions-hivehash}
2019-09-19 12:31:03 +00:00
Вычисляет `HiveHash` от строки.
2019-07-25 10:14:04 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-09-19 13:49:16 +00:00
SELECT hiveHash('');
2019-09-19 12:31:03 +00:00
```
2020-03-20 18:20:59 +00:00
`HiveHash` — это результат [JavaHash ](#hash_functions-javahash ) с обнулённым битом знака числа. Функция используется в [Apache Hive ](https://en.wikipedia.org/wiki/Apache_Hive ) вплоть до версии 3.0.
2019-09-19 12:31:03 +00:00
**Возвращаемое значение**
Хэш-значение типа `Int32` .
Тип: `hiveHash` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-19 12:31:03 +00:00
SELECT hiveHash('Hello, world!');
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-19 12:31:03 +00:00
┌─hiveHash('Hello, world!')─┐
│ 267439093 │
└───────────────────────────┘
```
2019-07-25 10:14:04 +00:00
2020-03-20 18:20:59 +00:00
## metroHash64 {#metrohash64}
2019-07-25 10:14:04 +00:00
2020-03-20 18:20:59 +00:00
Генерирует 64-х битное значение [MetroHash ](http://www.jandrewrogers.com/2015/05/27/metrohash/ ).
2019-07-25 10:14:04 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
metroHash64(par1, ...)
```
**Параметры**
Функция принимает переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
Значение хэша с типом данных [UInt64 ](../../data_types/int_uint.md ).
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT metroHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MetroHash, toTypeName(MetroHash) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌────────────MetroHash─┬─type───┐
│ 14235658766382344533 │ UInt64 │
└──────────────────────┴────────┘
```
2020-03-20 18:20:59 +00:00
## jumpConsistentHash {#jumpconsistenthash}
2019-07-25 10:14:04 +00:00
Вычисляет JumpConsistentHash от значения типа UInt64.
2019-10-17 10:38:32 +00:00
Имеет два параметра: ключ типа UInt64 и количество бакетов. Возвращает значение типа Int32.
2019-07-25 10:14:04 +00:00
Дополнительные сведения смотрите по ссылке: [JumpConsistentHash ](https://arxiv.org/pdf/1406.2294.pdf )
2020-03-20 18:20:59 +00:00
## murmurHash2\_32, murmurHash2\_64 {#murmurhash2-32-murmurhash2-64}
2019-07-25 10:14:04 +00:00
Генерирует значение [MurmurHash2 ](https://github.com/aappleby/smhasher ).
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
murmurHash2_32(par1, ...)
murmurHash2_64(par1, ...)
```
**Параметры**
О б е функции принимают переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
2020-03-21 04:11:51 +00:00
- Функция `murmurHash2_32` возвращает значение типа [UInt32 ](../../data_types/int_uint.md ).
- Функция `murmurHash2_64` возвращает значение типа [UInt64 ](../../data_types/int_uint.md ).
2019-07-25 10:14:04 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT murmurHash2_64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash2, toTypeName(MurmurHash2) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌──────────MurmurHash2─┬─type───┐
│ 11832096901709403633 │ UInt64 │
└──────────────────────┴────────┘
```
2020-03-20 18:20:59 +00:00
## murmurHash3\_32, murmurHash3\_64 {#murmurhash3-32-murmurhash3-64}
2019-07-25 10:14:04 +00:00
Генерирует значение [MurmurHash3 ](https://github.com/aappleby/smhasher ).
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
murmurHash3_32(par1, ...)
murmurHash3_64(par1, ...)
```
**Параметры**
О б е функции принимают переменное число входных параметров. Параметры могут быть любого [поддерживаемого типа данных ](../../data_types/index.md ).
**Возвращаемое значение**
2020-03-21 04:11:51 +00:00
- Функция `murmurHash3_32` возвращает значение типа [UInt32 ](../../data_types/int_uint.md ).
- Функция `murmurHash3_64` возвращает значение типа [UInt64 ](../../data_types/int_uint.md ).
2019-07-25 10:14:04 +00:00
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT murmurHash3_32(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash3, toTypeName(MurmurHash3) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌─MurmurHash3─┬─type───┐
│ 2152717 │ UInt32 │
└─────────────┴────────┘
```
2020-03-20 18:20:59 +00:00
## murmurHash3\_128 {#murmurhash3-128}
2019-07-25 10:14:04 +00:00
Генерирует значение [MurmurHash3 ](https://github.com/aappleby/smhasher ).
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
murmurHash3_128( expr )
```
**Параметры**
2020-03-21 04:11:51 +00:00
- `expr` — [выражение ](../syntax.md#syntax-expressions ) возвращающее значение типа[String](../../data_types/string.md).
2019-07-25 10:14:04 +00:00
**Возвращаемое значение**
Хэш-значение типа [FixedString(16) ](../../data_types/fixedstring.md ).
**Пример**
2020-03-20 18:20:59 +00:00
``` sql
2019-07-25 10:14:04 +00:00
SELECT murmurHash3_128('example_string') AS MurmurHash3, toTypeName(MurmurHash3) AS type
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-25 10:14:04 +00:00
┌─MurmurHash3──────┬─type────────────┐
│ 6<> 1<1C> 4"S5KT<4B> ~~q │ FixedString(16) │
└──────────────────┴─────────────────┘
```
2020-03-20 18:20:59 +00:00
## xxHash32, xxHash64 {#hash-functions-xxhash32-xxhash64}
2019-07-25 10:14:04 +00:00
2019-09-24 00:50:58 +00:00
Вычисляет `xxHash` от строки. Предлагается в двух вариантах: 32 и 64 бита.
2020-03-20 18:20:59 +00:00
``` sql
2019-09-24 00:50:58 +00:00
SELECT xxHash32('');
OR
SELECT xxHash64('');
```
**Возвращаемое значение**
Хэш-значение типа `Uint32` или `Uint64` .
Тип: `xxHash` .
**Пример**
Запрос:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-24 00:50:58 +00:00
SELECT xxHash32('Hello, world!');
```
Ответ:
2020-03-20 18:20:59 +00:00
``` text
2019-09-24 00:50:58 +00:00
┌─xxHash32('Hello, world!')─┐
│ 834093149 │
└───────────────────────────┘
```
**Смотрите также**
2020-03-21 04:11:51 +00:00
- [xxHash ](http://cyan4973.github.io/xxHash/ ).
2019-07-25 10:14:04 +00:00
2020-01-30 10:34:55 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/query_language/functions/hash_functions/ ) <!--hide-->