checksum

package module
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 3, 2023 License: MIT Imports: 12 Imported by: 0

README

consu/checksum

Go Report Card PkgGoDev Actions Status codecov

Package checksum provides utility functions to calculate checksum.

Installation

$ go get -u github.com/mikus/consu/checksum

Usage

package main

import (
	"fmt"
	"github.com/mikus/consu/checksum"
)

func main() {
	myValue := "any thing"

	// calculate checksum using MD5 hash
	checksum1 := Checksum(Md5HashFunc, myValue)
	fmt.Printf("%x\n", checksum1)

	// shortcut to calculate checksum using MD5 hash
	checksum2 := Md5Checksum(myValue)
	fmt.Printf("%x\n", checksum2)
}

Features:

  • Calculate checksum of scalar types (bool, int*, uint*, float*, string) as well as slice/array and map/struct.
  • Struct:
    • If time.Time, its nanosecond is used to calculate checksum (since v0.1.2).
    • Be able to calculate checksum of unexported fields.
    • If the struct has function Checksum(), use it instead of reflecting through struct's fields.
  • Supported hash functions: CRC32, MD5, SHA1, SHA256, SHA512.
  • A value of type integer will have the same checksum regardless it is int, int8, int16, int32, int64, uint, uint8, uint16, uint32 or uint64. E.g. checksum(int(103)) == checksum(uint64(103))
  • A value of type float will have the same checksum regardless it is float32 or float64. E.g. checksum(float32(10.3)) == checksum(float64(10.3))
  • Pointer to a value will have the same checksum as the value itself. E.g. checksum(myInt) == checksum(&myInt)
  • Slice and Array will have the same checksum. E.g. checksum([]int{1,2,3}) == checksum([3]int{1,2,3})
  • Map and Struct: order of fields does not affect checksum, but field names do! E.g. checksum(map[string]int{"one":1,"two":2}) == checksum(map[string]int{"two":2,"one":1}), but checksum(map[string]int{"a":1,"b":2}) != checksum(map[string]int{"x":1,"y":2})

History

2023-08-03 - v0.1.3

Use UnixNano() method instead of Nanoseconds() for time.Time.

2020-11-20 - v0.1.2

If a struct is time.Time, use its nanosecond to calculate checksum.

2019-10-26 - v0.1.1

If a struct has function Checksum(), use it to calculate checksum instead of reflecting through struct's fields.

2019-10-17 - v0.1.0

First release:

  • Calculate checksum of scalar types (bool, int*, uint*, float*, string) as well as slice/array and map/struct.
  • Supported hash functions: CRC32, MD5, SHA1, SHA256, SHA512.

Documentation

Overview

Package checksum provides utility functions to calculate checksum.

  • A value of type integer will have the same checksum regardless it is int, int8, int16, int32, int64, uint, uint8, uint16, uint32 or uint64. E.g. checksum(int(103)) == checksum(uint64(103))
  • A value of type float will have the same checksum regardless it is float32 or float64. E.g. checksum(float32(10.3)) == checksum(float64(10.3))
  • Pointer to a value will have the same checksum as the value itself. E.g. checksum(myInt) == checksum(&myInt)
  • Slice and Array: will have the same checksum. E.g. checksum([]int{1,2,3}) == checksum([3]int{1,2,3})
  • Map and Struct: order of fields does not affect checksum, but field names do! E.g. checksum(map[string]int{"one":1,"two":2}) == checksum(map[string]int{"two":2,"one":1}), but checksum(map[string]int{"a":1,"b":2}) != checksum(map[string]int{"x":1,"y":2})
  • Struct: be able to calculate checksum of unexported fields.

Sample usage:

package main

import (
	"fmt"
	"github.com/mikus/consu/checksum"
)

func main() {
	myValue := "any thing"

	// calculate checksum using MD5 hash
	checksum1 := Checksum(Md5HashFunc, myValue)
	fmt.Printf("%x\n", checksum1)

	// shortcut to calculate checksum using MD5 hash
	checksum2 := Md5Checksum(myValue)
	fmt.Printf("%x\n", checksum2)
}

Index

Constants

View Source
const (
	// Version defines version number of this package
	Version = "0.1.2"
)

Variables

This section is empty.

Functions

func Checksum

func Checksum(hf HashFunc, v interface{}) []byte

Checksum calculates checksum of an input using the provided hash function.

  • If v is a scalar type (bool, int*, uint*, float* or string) or pointer to scala type: checksum value is straightforward calculation.
  • If v is a slice or array: checksum value is combination of all elements' checksums, in order. If v is empty (has 0 elements), empty []byte is returned.
  • If v is a map: checksum value is combination of all entries' checksums, order-independent.
  • If v is a struct:
  • if the struct has function `Checksum()` then use it to calculate checksum value.
  • if v is time.Time then use its nanosecond to calculate checksum value.
  • otherwise checksum value is combination of all fields' checksums, order-independent.

func Crc32Checksum

func Crc32Checksum(v interface{}) []byte

Crc32Checksum is shortcut of Checksum(Crc32HashFunc, v).

func Md5Checksum

func Md5Checksum(v interface{}) []byte

Md5Checksum is shortcut of Checksum(Md5HashFunc, v).

func Sha1Checksum

func Sha1Checksum(v interface{}) []byte

Sha1Checksum is shortcut of Checksum(Sha1HashFunc, v).

func Sha256Checksum

func Sha256Checksum(v interface{}) []byte

Sha256Checksum is shortcut of Checksum(Sha256HashFunc, v).

func Sha512Checksum

func Sha512Checksum(v interface{}) []byte

Sha512Checksum is shortcut of Checksum(Sha512HashFunc, v).

Types

type HashFunc

type HashFunc func(input []byte) []byte

HashFunc defines a function that calculates hash value of a byte array.

var Crc32HashFunc HashFunc = func(input []byte) []byte {
	return hashFunc(crc32.NewIEEE(), input)
}

Crc32HashFunc is a HashFunc that calculates hash value using CRC32.

var Md5HashFunc HashFunc = func(input []byte) []byte {
	return hashFunc(md5.New(), input)
}

Md5HashFunc is a HashFunc that calculates hash value using MD5.

var Sha1HashFunc HashFunc = func(input []byte) []byte {
	return hashFunc(sha1.New(), input)
}

Sha1HashFunc is a HashFunc that calculates hash value using SHA1.

var Sha256HashFunc HashFunc = func(input []byte) []byte {
	return hashFunc(sha256.New(), input)
}

Sha256HashFunc is a HashFunc that calculates hash value using SHA256.

var Sha512HashFunc HashFunc = func(input []byte) []byte {
	return hashFunc(sha512.New(), input)
}

Sha512HashFunc is a HashFunc that calculates hash value using SHA512.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL