Spec-Zone.ru › Nim 1

hashes

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

  • !& proc используется для начала или смешивания хеш-значения, и
  • !$ proc используется для завершения хеш-значения.

Если вы хотите реализовать процедуры хеширования для своих пользовательских типов, вам придётся написать следующий скелет кода:

proc hash(x: Something): Hash =
  ## Computes a Hash from `x`.
  var h: Hash = 0
  # Iterate over parts of `x`.
  for xAtom in x:
    # Mix the atom with the partial hash.
    h = h !& xAtom
  # Finish the hash.
  result = !$h

Если ваши пользовательские типы содержат поля, для которых уже существует процедура хеширования, например, объекты, состоящие из strings, вы можете просто объединить хеш-значения отдельных полей:

proc hash(x: Something): Hash =
  ## Computes a Hash from `x`.
  var h: Hash = 0
  h = h !& hash(x.foo)
  h = h !& hash(x.bar)
  result = !$h

См. также:

  • модуль md5 для алгоритма MD5 контрольной суммы
  • модуль base64 для кодировщика и декодировщика base64
  • модуль std/sha1 для кодировщика и декодировщика sha1
  • модуль таблиц для хеш-таблиц

Импорты

since

Типы

Hash = int
Значение хеша. Хеш-таблицы, использующие эти значения, должны всегда иметь размер, являющийся степенью двойки, и могут использовать оператор and вместо оператора mod для усечения значения хеша. Исходный код Изменить

Процедуры

proc `!&`(h: Hash; val: int): Hash {...}{.inline, raises: [], tags: [].}

Смешивает хеш-значение h с val для получения нового хеш-значения.

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

Исходный код Изменить
proc `!$`(h: Hash): Hash {...}{.inline, raises: [], tags: [].}

Завершает вычисление хеш-значения.

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

Исходный код Изменить
proc hashWangYi1(x: int64 | uint64 | Hash): Hash {...}{.inline.}
Хеширование Wang Yi's hash_v1 для 8-байтового int. https://github.com/rurban/smhasher содержит более подробную информацию. Это прошло все тесты перемешивания весной 2019 года и просто. ПРИМЕЧАНИЕ: Определение proc(x: int16): Hash = hashWangYi1(Hash(x)) допустимо. Исходный код Изменить
proc hashData(data: pointer; size: int): Hash {...}{.raises: [], tags: [].}
Хеширование массива байтов размером size. Исходный код Изменить
proc hash(x: pointer): Hash {...}{.inline, raises: [], tags: [].}
Эффективное хеширование указателей. Исходный код Изменить
proc hash[T: proc](x: T): Hash {...}{.inline.}
Эффективное хеширование переменных proc. Также поддерживаются замыкания. Исходный код Изменить
proc hashIdentity[T: Ordinal | enum](x: T): Hash {...}{.inline.}
Хеш тождества. То есть hashIdentity(x) = x. Исходный код Изменить
proc hash[T: Ordinal | enum](x: T): Hash {...}{.inline.}
Эффективное хеширование целых чисел. Исходный код Изменить
proc hash(x: float): Hash {...}{.inline, raises: [], tags: [].}
Эффективное хеширование чисел с плавающей точкой. Исходный код Изменить
proc hash(x: string): Hash {...}{.raises: [], tags: [].}

Эффективное хеширование строк.

См. также:

  • hashIgnoreStyle
  • hashIgnoreCase

Пример:

doAssert hash("abracadabra") != hash("AbracadabrA")
Исходный код Изменить
proc hash(x: cstring): Hash {...}{.raises: [], tags: [].}
Эффективное хеширование строк с нулевым завершением.

Пример:

doAssert hash(cstring"abracadabra") == hash("abracadabra")
doAssert hash(cstring"AbracadabrA") == hash("AbracadabrA")
doAssert hash(cstring"abracadabra") != hash(cstring"AbracadabrA")
Исходный код Изменить
proc hash(sBuf: string; sPos, ePos: int): Hash {...}{.raises: [], tags: [].}

Эффективное хеширование буфера строки, от начальной позиции sPos до конечной позиции ePos (включительно).

hash(myStr, 0, myStr.high) эквивалентно hash(myStr).

Пример:

var a = "abracadabra"
doAssert hash(a, 0, 3) == hash(a, 7, 10)
Исходный код Изменить
proc hashIgnoreStyle(x: string): Hash {...}{.raises: [], tags: [].}

Эффективное хеширование строк; стиль игнорируется.

Примечание: Использует другой алгоритм хеширования, чем hash(string).

См. также:

  • hashIgnoreCase

Пример:

doAssert hashIgnoreStyle("aBr_aCa_dAB_ra") == hashIgnoreStyle("abracadabra")
doAssert hashIgnoreStyle("abcdefghi") != hash("abcdefghi")
Исходный код Изменить
proc hashIgnoreStyle(sBuf: string; sPos, ePos: int): Hash {...}{.raises: [], tags: [].}

Эффективное хеширование буфера строки, от начальной позиции sPos до конечной позиции ePos (включительно); стиль игнорируется.

Примечание: Использует другой алгоритм хеширования, чем hash(string).

hashIgnoreStyle(myBuf, 0, myBuf.high) эквивалентно hashIgnoreStyle(myBuf).

Пример:

var a = "ABracada_b_r_a"
doAssert hashIgnoreStyle(a, 0, 3) == hashIgnoreStyle(a, 7, a.high)
Исходный код Изменить
proc hashIgnoreCase(x: string): Hash {...}{.raises: [], tags: [].}

Эффективное хеширование строк; регистр игнорируется.

Примечание: Использует другой алгоритм хеширования, чем hash(string).

См. также:

  • hashIgnoreStyle

Пример:

doAssert hashIgnoreCase("ABRAcaDABRA") == hashIgnoreCase("abRACAdabra")
doAssert hashIgnoreCase("abcdefghi") != hash("abcdefghi")
Исходный код Изменить
proc hashIgnoreCase(sBuf: string; sPos, ePos: int): Hash {...}{.raises: [], tags: [].}

Эффективное хеширование буфера строки, от начальной позиции sPos до конечной позиции ePos (включительно); регистр игнорируется.

Примечание: Использует другой алгоритм хеширования, чем hash(string).

hashIgnoreCase(myBuf, 0, myBuf.high) эквивалентно hashIgnoreCase(myBuf).

Пример:

var a = "ABracadabRA"
doAssert hashIgnoreCase(a, 0, 3) == hashIgnoreCase(a, 7, 10)
Исходный код Изменить
proc hash[T: tuple](x: T): Hash
Эффективное хеширование кортежей. Исходный код Изменить
proc hash[A](x: openArray[A]): Hash
Эффективное хеширование массивов и последовательностей. Исходный код Изменить
proc hash[A](aBuf: openArray[A]; sPos, ePos: int): Hash

Эффективное хеширование частей массивов и последовательностей, от начальной позиции sPos до конечной позиции ePos (включительно).

hash(myBuf, 0, myBuf.high) эквивалентно hash(myBuf).

Пример:

let a = [1, 2, 5, 1, 2, 6]
doAssert hash(a, 0, 1) == hash(a, 3, 4)
Исходный код Изменить
proc hash[A](x: set[A]): Hash
Эффективное хеширование множеств. Исходный код Изменить

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/hashes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API