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

Интерфейс hash.Hash32 предназначен для вычисления 32-битных хеш-сумм. Он объединяет методы интерфейса hash.Hash с дополнительным методом Sum32, который возвращает хеш в виде 32-битного целого числа без знака. Этот интерфейс реализуется многими хеш-алгоритмами, такими как CRC32, Adler-32 и FNV-32.

Синтаксис

gotype Hash32 interface {
  hash.Hash
  Sum32() uint32
}

Метод Sum32 возвращает текущее значение хеша как число типа uint32, не изменяя при этом состояние хеша. Это позволяет продолжать запись данных после получения промежуточного результата.

Пример использования с CRC32

Давайте вычислим 32-битный хеш CRC32 для строки "abcde" с использованием стандартной таблицы IEEE:

gopackage main

import (
  "crypto/crc32"
  "fmt"
  "hash"
)

func main() {
  var h hash.Hash32 = crc32.NewIEEE()
  h.Write([]byte("abcde"))
  res := h.Sum32()
  fmt.Println(res)
}

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

go858411673

Пример с FNV-32

Вычислим 32-битный хеш FNV-1a для строки "12345":

gopackage main

import (
  "crypto/fnv"
  "fmt"
  "hash"
)

func main() {
  var h hash.Hash32 = fnv.New32a()
  h.Write([]byte("12345"))
  res := h.Sum32()
  fmt.Println(res)
}

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

go1391780666

Пример с промежуточным хешем

Покажем, что Sum32 не сбрасывает состояние хеша, и его можно вызывать несколько раз:

gopackage main

import (
  "crypto/adler32"
  "fmt"
  "hash"
)

func main() {
  var h hash.Hash32 = adler32.New()
  h.Write([]byte("a"))
  first := h.Sum32()
  h.Write([]byte("bcde"))
  second := h.Sum32()
  fmt.Println(first, second)
}

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

go65537 858411673

Сброс состояния хеша

Метод Reset сбрасывает состояние хеша в начальное значение, позволяя переиспользовать объект для новых вычислений:

gopackage main

import (
  "crypto/crc32"
  "fmt"
  "hash"
)

func main() {
  var h hash.Hash32 = crc32.NewIEEE()
  h.Write([]byte("abcde"))
  first := h.Sum32()
  h.Reset()
  h.Write([]byte("12345"))
  second := h.Sum32()
  fmt.Println(first, second)
}

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

go858411673 2611413777

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

  • интерфейс hash.Hash,
    базовый интерфейс для всех хеш-функций
  • интерфейс hash.Hash64,
    расширяет базовый интерфейс для 64-битных хешей
  • функцию crc32.NewIEEE,
    создает новый хеш CRC32 с таблицей IEEE
  • функцию fnv.New32a,
    создает новый хеш FNV-1a для 32-битных хешей