README
¶
go-multihash
multihash implementation in Go
Table of Contents
Install
go-multihash
is a standard Go module which can be installed with:
go get github.com/multiformats/go-multihash
Usage
Example
This example takes a standard hex-encoded data and uses EncodeName
to calculate the SHA1 multihash value for the buffer.
The resulting hex-encoded data corresponds to: <hash function code><digest size><hash function output>
, which could be re-parsed
with Multihash.FromHexString()
.
package main
import (
"encoding/hex"
"fmt"
"github.com/multiformats/go-multihash"
)
func main() {
// ignores errors for simplicity.
// don't do that at home.
// Decode a SHA1 hash to a binary buffer
buf, _ := hex.DecodeString("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33")
// Create a new multihash with it.
mHashBuf, _ := multihash.EncodeName(buf, "sha1")
// Print the multihash as hex string
fmt.Printf("hex: %s\n", hex.EncodeToString(mHashBuf))
// Parse the binary multihash to a DecodedMultihash
mHash, _ := multihash.Decode(mHashBuf)
// Convert the sha1 value to hex string
sha1hex := hex.EncodeToString(mHash.Digest)
// Print all the information in the multihash
fmt.Printf("obj: %v 0x%x %d %s\n", mHash.Name, mHash.Code, mHash.Length, sha1hex)
}
To run, copy to example/foo.go and:
> cd example/
> go build
> ./example
hex: 11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
obj: sha1 0x11 20 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
Maintainers
Captain: @Kubuxu.
Contribute
Contributions welcome. Please check out the issues.
Check out our contributing document for more information on how we work, and about contributing in general. Please be aware that all interactions related to multiformats are subject to the IPFS Code of Conduct.
Small note: If editing the README, please conform to the standard-readme specification.
License
MIT © 2014 Juan Batiz-Benet
Documentation
¶
Overview ¶
Package multihash is the Go implementation of https://github.com/multiformats/multihash, or self-describing hashes.
Index ¶
- Constants
- Variables
- func Encode(buf []byte, code uint64) ([]byte, error)
- func EncodeName(buf []byte, name string) ([]byte, error)
- func RegisterHashFunc(code uint64, hashFunc HashFunc) error
- func ValidCode(code uint64) bool
- type DecodedMultihash
- type ErrInconsistentLen
- type HashFunc
- type Multihash
- type Reader
- type Writer
Examples ¶
Constants ¶
const (
ID = 0x00
SHA1 = 0x11
SHA2_256 = 0x12
SHA2_512 = 0x13
SHA3_224 = 0x17
SHA3_256 = 0x16
SHA3_384 = 0x15
SHA3_512 = 0x14
SHA3 = SHA3_512
KECCAK_224 = 0x1A
KECCAK_256 = 0x1B
KECCAK_384 = 0x1C
KECCAK_512 = 0x1D
SHAKE_128 = 0x18
SHAKE_256 = 0x19
BLAKE2B_MIN = 0xb201
BLAKE2B_MAX = 0xb240
BLAKE2S_MIN = 0xb241
BLAKE2S_MAX = 0xb260
DBL_SHA2_256 = 0x56
MURMUR3 = 0x22
X11 = 0x1100
)
constants
Variables ¶
var (
ErrUnknownCode = errors.New("unknown multihash code")
ErrTooShort = errors.New("multihash too short. must be >= 2 bytes")
ErrTooLong = errors.New("multihash too long. must be < 129 bytes")
ErrLenNotSupported = errors.New("multihash does not yet support digests longer than 127 bytes")
ErrInvalidMultihash = errors.New("input isn't valid multihash")
ErrVarintBufferShort = errors.New("uvarint: buffer too small")
ErrVarintTooLong = errors.New("uvarint: varint too big (max 64bit)")
)
errors
var Codes = map[uint64]string{
ID: "id",
SHA1: "sha1",
SHA2_256: "sha2-256",
SHA2_512: "sha2-512",
SHA3_224: "sha3-224",
SHA3_256: "sha3-256",
SHA3_384: "sha3-384",
SHA3_512: "sha3-512",
DBL_SHA2_256: "dbl-sha2-256",
MURMUR3: "murmur3",
KECCAK_224: "keccak-224",
KECCAK_256: "keccak-256",
KECCAK_384: "keccak-384",
KECCAK_512: "keccak-512",
SHAKE_128: "shake-128",
SHAKE_256: "shake-256",
X11: "x11",
}
Codes maps a hash code to it's name
var DefaultLengths = map[uint64]int{
ID: -1,
SHA1: 20,
SHA2_256: 32,
SHA2_512: 64,
SHA3_224: 28,
SHA3_256: 32,
SHA3_384: 48,
SHA3_512: 64,
DBL_SHA2_256: 32,
KECCAK_224: 28,
KECCAK_256: 32,
MURMUR3: 4,
KECCAK_384: 48,
KECCAK_512: 64,
SHAKE_128: 32,
SHAKE_256: 64,
X11: 64,
}
DefaultLengths maps a hash code to it's default length
var ErrSumNotSupported = errors.New("Function not implemented. Complain to lib maintainer.")
ErrSumNotSupported is returned when the Sum function code is not implemented
var Names = map[string]uint64{
"id": ID,
"sha1": SHA1,
"sha2-256": SHA2_256,
"sha2-512": SHA2_512,
"sha3": SHA3_512,
"sha3-224": SHA3_224,
"sha3-256": SHA3_256,
"sha3-384": SHA3_384,
"sha3-512": SHA3_512,
"dbl-sha2-256": DBL_SHA2_256,
"murmur3": MURMUR3,
"keccak-224": KECCAK_224,
"keccak-256": KECCAK_256,
"keccak-384": KECCAK_384,
"keccak-512": KECCAK_512,
"shake-128": SHAKE_128,
"shake-256": SHAKE_256,
"x11": X11,
}
Names maps the name of a hash to the code
Functions ¶
func Encode ¶
func Encode(buf []byte, code uint64) ([]byte, error)
Encode a hash digest along with the specified function code. Note: the length is derived from the length of the digest itself.
func EncodeName ¶
func EncodeName(buf []byte, name string) ([]byte, error)
EncodeName is like Encode() but providing a string name instead of a numeric code. See Names for allowed values.
Example ¶
Output:
hex: 11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
func RegisterHashFunc ¶
func RegisterHashFunc(code uint64, hashFunc HashFunc) error
RegisterHashFunc adds an entry to the package-level code -> hash func map. The hash function must return at least the requested number of bytes. If it returns more, the hash will be truncated.
Types ¶
type DecodedMultihash ¶
type DecodedMultihash struct {
Code uint64
Name string
Length int // Length is just int as it is type of len() opearator
Digest []byte // Digest holds the raw multihash bytes
}
DecodedMultihash represents a parsed multihash and allows easy access to the different parts of a multihash.
type ErrInconsistentLen ¶
type ErrInconsistentLen struct {
// contains filtered or unexported fields
}
ErrInconsistentLen is returned when a decoded multihash has an inconsistent length
type HashFunc ¶
type HashFunc func(data []byte, length int) (digest []byte, err error)
HashFunc is a hash function that hashes data into digest.
The length is the size the digest will be truncated to. While the hash function isn't responsible for truncating the digest, it may want to error if the length is invalid for the hash function (e.g., truncation would make the hash useless).
type Multihash ¶
type Multihash []byte
Multihash is byte slice with the following form: <hash function code><digest size><hash function output>. See the spec for more information.
func Cast ¶
func Cast(buf []byte) (Multihash, error)
Cast casts a buffer onto a multihash, and returns an error if it does not work.
func FromB58String ¶
func FromB58String(s string) (m Multihash, err error)
FromB58String parses a B58-encoded multihash.
func FromHexString ¶
func FromHexString(s string) (Multihash, error)
FromHexString parses a hex-encoded multihash.
func Sum ¶
func Sum(data []byte, code uint64, length int) (Multihash, error)
Sum obtains the cryptographic sum of a given buffer. The length parameter indicates the length of the resulting digest and passing a negative value use default length values for the selected hash function.
func (Multihash) B58String ¶
func (m Multihash) B58String() string
B58String returns the B58-encoded representation of a multihash.