Интерфейс hash.Hash64

Интерфейс hash.Hash64 предназначен для вычисления 64-битных хеш-сумм. Он включает все методы базового интерфейса hash.Hash и добавляет метод Sum64, который возвращает хеш в виде 64-битного целого числа без знака. Этот интерфейс удобно использовать с алгоритмами хеширования, которые генерируют 64-битные хеши, например, FNV-64 или CRC-64.

Синтаксис

gotype Hash64 interface {
  hash.Hash
  Sum64() uint64
}

Интерфейс hash.Hash64 объединяет стандартный интерфейс хеша и метод Sum64, который возвращает итоговое 64-битное значение.

Пример использования с FNV-64

Создадим хеш FNV-64 с помощью функции fnv.New64, запишем в него строку и получим 64-битный хеш:

gopackage main

import (
  "fmt"
  "hash/fnv"
)

func main() {
  h := fnv.New64()
  h.Write([]byte("hello world"))
  res := h.Sum64()
  fmt.Println(res)
}

Результат выполнения кода:

go15390171016868245922

Пример использования с FNV-64a

Алгоритм FNV-64a также реализует интерфейс hash.Hash64. Используем функцию fnv.New64a для создания хеша:

gopackage main

import (
  "fmt"
  "hash/fnv"
)

func main() {
  h := fnv.New64a()
  h.Write([]byte("hello world"))
  res := h.Sum64()
  fmt.Println(res)
}

Результат выполнения кода:

go15263374897754137074

Пример с хешированием нескольких фрагментов данных

Метод Write можно вызывать несколько раз для разных частей данных, а затем получить итоговый хеш:

gopackage main

import (
  "fmt"
  "hash/fnv"
)

func main() {
  h := fnv.New64()
  h.Write([]byte("hello"))
  h.Write([]byte(" "))
  h.Write([]byte("world"))
  res := h.Sum64()
  fmt.Println(res)
}

Результат выполнения кода:

go15390171016868245922

Обратите внимание, что результат совпадает с результатом хеширования строки "hello world" целиком, так как хеш-функция обрабатывает все переданные данные как единый поток.

Пример с CRC-64

Пакет crc64 также предоставляет реализацию hash.Hash64. Создадим хеш CRC-64 с таблицей ECMA и вычислим 64-битный хеш:

gopackage main

import (
  "fmt"
  "hash/crc64"
)

func main() {
  table := crc64.MakeTable(crc64.ECMA)
  h := crc64.New(table)
  h.Write([]byte("hello world"))
  res := h.Sum64()
  fmt.Println(res)
}

Результат выполнения кода:

go15715793865936234776

Метод Sum64 в сравнении с Sum

В отличие от метода Sum, который возвращает срез байт, метод Sum64 возвращает число типа uint64, что удобно для числовых сравнений и использования в качестве ключей в структурах данных:

gopackage main

import (
  "fmt"
  "hash/fnv"
)

func main() {
  h := fnv.New64()
  h.Write([]byte("hello world"))
  res64 := h.Sum64()
  resBytes := h.Sum(nil)
  fmt.Printf("Sum64: %d\n", res64)
  fmt.Printf("Sum: %v\n", resBytes)
}

Результат выполнения кода:

go"Sum64: 15390171016868245922"
"Sum: [213 253 109 26 42 186 222 201]"

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

  • интерфейс hash.Hash,
    базовый интерфейс для всех хеш-функций
  • интерфейс hash.Hash32,
    для вычисления 32-битных хеш-сумм
  • функцию fnv.New64,
    создающую хеш FNV-64
  • функцию crc64.New,
    создающую хеш CRC-64 для заданной таблицы