ClickHouse/docs/ru/sql_reference/functions/hash_functions.md
2020-04-09 21:06:07 +03:00

18 KiB
Raw Blame History

Функции хэширования

Функции хэширования могут использоваться для детерминированного псевдослучайного разбрасывания элементов.

halfMD5

Интерпретирует все входные параметры как строки и вычисляет хэш MD5 для каждой из них. Затем объединяет хэши, берет первые 8 байт хэша результирующей строки и интерпретирует их как значение типа UInt64 с big-endian порядком байтов.

halfMD5(par1, ...)

Функция относительно медленная (5 миллионов коротких строк в секунду на ядро процессора). По возможности, используйте функцию sipHash64 вместо неё.

Параметры

Функция принимает переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

Значение хэша с типом данных UInt64.

Пример

SELECT halfMD5(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS halfMD5hash, toTypeName(halfMD5hash) AS type
┌────────halfMD5hash─┬─type───┐
│ 186182704141653334 │ UInt64 │
└────────────────────┴────────┘

MD5

Вычисляет MD5 от строки и возвращает полученный набор байт в виде FixedString(16). Если вам не нужен конкретно MD5, а нужен неплохой криптографический 128-битный хэш, то используйте вместо этого функцию sipHash128. Если вы хотите получить такой же результат, как выдаёт утилита md5sum, напишите lower(hex(MD5(s))).

sipHash64

Генерирует 64-х битное значение SipHash.

sipHash64(par1,...)

Это криптографическая хэш-функция. Она работает по крайней мере в три раза быстрее, чем функция MD5.

Функция интерпретирует все входные параметры как строки и вычисляет хэш MD5 для каждой из них. Затем комбинирует хэши по следующему алгоритму.

  1. После хэширования всех входных параметров функция получает массив хэшей.
  2. Функция принимает первый и второй элементы и вычисляет хэш для массива из них.
  3. Затем функция принимает хэш-значение, вычисленное на предыдущем шаге, и третий элемент исходного хэш-массива, и вычисляет хэш для массива из них.
  4. Предыдущий шаг повторяется для всех остальных элементов исходного хэш-массива.

Параметры

Функция принимает переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

Значение хэша с типом данных UInt64.

Пример

SELECT sipHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type
┌──────────────SipHash─┬─type───┐
│ 13726873534472839665 │ UInt64 │
└──────────────────────┴────────┘

sipHash128

Вычисляет SipHash от строки. Принимает аргумент типа String. Возвращает FixedString(16). Отличается от sipHash64 тем, что финальный xor-folding состояния делается только до 128 бит.

cityHash64

Генерирует 64-х битное значение CityHash.

cityHash64(par1,...)

Это не криптографическая хэш-функция. Она использует CityHash алгоритм для строковых параметров и зависящую от реализации быструю некриптографическую хэш-функцию для параметров с другими типами данных. Функция использует комбинатор CityHash для получения конечных результатов.

Параметры

Функция принимает переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

Значение хэша с типом данных UInt64.

Примеры

Пример вызова:

SELECT cityHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS CityHash, toTypeName(CityHash) AS type
┌─────────────CityHash─┬─type───┐
│ 12072650598913549138 │ UInt64 │
└──────────────────────┴────────┘

А вот так вы можете вычислить чексумму всей таблицы с точностью до порядка строк:

SELECT groupBitXor(cityHash64(*)) FROM table

intHash32

Вычисляет 32-битный хэш-код от целого числа любого типа. Это сравнительно быстрая не криптографическая хэш-функция среднего качества для чисел.

intHash64

Вычисляет 64-битный хэш-код от целого числа любого типа. Работает быстрее, чем intHash32. Качество среднее.

SHA1

SHA224

SHA256

Вычисляет SHA-1, SHA-224, SHA-256 от строки и возвращает полученный набор байт в виде FixedString(20), FixedString(28), FixedString(32). Функция работает достаточно медленно (SHA-1 - примерно 5 миллионов коротких строк в секунду на одном процессорном ядре, SHA-224 и SHA-256 - примерно 2.2 миллионов). Рекомендуется использовать эти функции лишь в тех случаях, когда вам нужна конкретная хэш-функция и вы не можете её выбрать. Даже в этих случаях, рекомендуется применять функцию оффлайн - заранее вычисляя значения при вставке в таблицу, вместо того, чтобы применять её при SELECT-ах.

URLHash(url[, N])

Быстрая не криптографическая хэш-функция неплохого качества для строки, полученной из URL путём некоторой нормализации. URLHash(s) - вычислить хэш от строки без одного завершающего символа /, ? или # на конце, если там такой есть. URLHash(s, N) - вычислить хэш от строки до N-го уровня в иерархии URL, без одного завершающего символа /, ? или # на конце, если там такой есть. Уровни аналогичные URLHierarchy. Функция специфична для Яндекс.Метрики.

farmHash64

Генерирует 64-х битное значение FarmHash.

farmHash64(par1, ...)

Из всех доступных методов функция использует Hash64.

Параметры

Функция принимает переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

Значение хэша с типом данных UInt64.

Пример

SELECT farmHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS FarmHash, toTypeName(FarmHash) AS type
┌─────────────FarmHash─┬─type───┐
│ 17790458267262532859 │ UInt64 │
└──────────────────────┴────────┘

javaHash

Вычисляет JavaHash от строки. JavaHash не отличается ни скоростью, ни качеством, поэтому эту функцию следует считать устаревшей. Используйте эту функцию, если вам необходимо получить значение хэша по такому же алгоритму.

SELECT javaHash('');

Возвращаемое значение

Хэш-значение типа Int32.

Тип: javaHash.

Пример

Запрос:

SELECT javaHash('Hello, world!');

Ответ:

┌─javaHash('Hello, world!')─┐
│               -1880044555 │
└───────────────────────────┘

javaHashUTF16LE

Вычисляет JavaHash от строки, при допущении, что строка представлена в кодировке UTF-16LE.

Синтаксис

javaHashUTF16LE(stringUtf16le)

Параметры

  • stringUtf16le — строка в UTF-16LE.

Возвращаемое значение

Хэш-значение типа Int32.

Тип: javaHash.

Пример

Верный запрос для строки кодированной в UTF-16LE.

Запрос:

SELECT javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))

Ответ:

┌─javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))─┐
│                                                      3556498 │
└──────────────────────────────────────────────────────────────┘

hiveHash

Вычисляет HiveHash от строки.

SELECT hiveHash('');

HiveHash — это результат JavaHash с обнулённым битом знака числа. Функция используется в Apache Hive вплоть до версии 3.0.

Возвращаемое значение

Хэш-значение типа Int32.

Тип: hiveHash.

Пример

Запрос:

SELECT hiveHash('Hello, world!');

Ответ:

┌─hiveHash('Hello, world!')─┐
│                 267439093 │
└───────────────────────────┘

metroHash64

Генерирует 64-х битное значение MetroHash.

metroHash64(par1, ...)

Параметры

Функция принимает переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

Значение хэша с типом данных UInt64.

Пример

SELECT metroHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MetroHash, toTypeName(MetroHash) AS type
┌────────────MetroHash─┬─type───┐
│ 14235658766382344533 │ UInt64 │
└──────────────────────┴────────┘

jumpConsistentHash

Вычисляет JumpConsistentHash от значения типа UInt64. Имеет два параметра: ключ типа UInt64 и количество бакетов. Возвращает значение типа Int32. Дополнительные сведения смотрите по ссылке: JumpConsistentHash

murmurHash2_32, murmurHash2_64

Генерирует значение MurmurHash2.

murmurHash2_32(par1, ...)
murmurHash2_64(par1, ...)

Параметры

Обе функции принимают переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

  • Функция murmurHash2_32 возвращает значение типа UInt32.
  • Функция murmurHash2_64 возвращает значение типа UInt64.

Пример

SELECT murmurHash2_64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash2, toTypeName(MurmurHash2) AS type
┌──────────MurmurHash2─┬─type───┐
│ 11832096901709403633 │ UInt64 │
└──────────────────────┴────────┘

murmurHash3_32, murmurHash3_64

Генерирует значение MurmurHash3.

murmurHash3_32(par1, ...)
murmurHash3_64(par1, ...)

Параметры

Обе функции принимают переменное число входных параметров. Параметры могут быть любого поддерживаемого типа данных.

Возвращаемое значение

  • Функция murmurHash3_32 возвращает значение типа UInt32.
  • Функция murmurHash3_64 возвращает значение типа UInt64.

Пример

SELECT murmurHash3_32(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash3, toTypeName(MurmurHash3) AS type
┌─MurmurHash3─┬─type───┐
│     2152717 │ UInt32 │
└─────────────┴────────┘

murmurHash3_128

Генерирует значение MurmurHash3.

murmurHash3_128( expr )

Параметры

Возвращаемое значение

Хэш-значение типа FixedString(16).

Пример

SELECT murmurHash3_128('example_string') AS MurmurHash3, toTypeName(MurmurHash3) AS type
┌─MurmurHash3──────┬─type────────────┐
│ 6<>1<1C>4"S5KT<4B>~~q │ FixedString(16) │
└──────────────────┴─────────────────┘

xxHash32, xxHash64

Вычисляет xxHash от строки. Предлагается в двух вариантах: 32 и 64 бита.

SELECT xxHash32('');

OR

SELECT xxHash64('');

Возвращаемое значение

Хэш-значение типа Uint32 или Uint64.

Тип: xxHash.

Пример

Запрос:

SELECT xxHash32('Hello, world!');

Ответ:

┌─xxHash32('Hello, world!')─┐
│                 834093149 │
└───────────────────────────┘

Смотрите также

Оригинальная статья