ik5 / deephash

Deep hashing for Go - able to calculate an fnv hash of nested data structures with exported fields.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Deep hash

Build Status

A library for calculating a deterministic hash for simple or nested data structures in Go. The traversal algorithm is based on mergo, which is in turn based on reflect/deepequal.go from the stdlib.

Example:

eg1 := "foo"
eg2 := example{
	Foo: "foo",
	Bar: 43.0,
}
eg3 := &example{
	Foo: "foo",
	Bar: 43.0,
}

fmt.Printf("String\t%x\n", deephash.Hash(eg1))
fmt.Printf("Struct\t%x\n", deephash.Hash(eg2))
fmt.Printf("Pointer\t%x\n", deephash.Hash(eg3))

Output:

String	dcb27518fed9d577
Struct	e0979b89bf545866
Pointer	e0979b89bf545866

It's worth noting that here two structs with the same content (eg: a copy), where one is a pointer and one isn't, both hash to the same value.

You can run this via:

go run example/example.go

Key features

  • uses fnv 64a hashing algorithm which is fast with good distribution
  • deterministic hashing for maps (which don't have any order) by sorting on the hash of the keys

Docs

http://godoc.org/github.com/davegardnerisme/deephash

About

Deep hashing for Go - able to calculate an fnv hash of nested data structures with exported fields.

License:MIT License


Languages

Language:Go 100.0%