diff --git a/core/magic.go b/core/magic.go index d7121c8..d604026 100644 --- a/core/magic.go +++ b/core/magic.go @@ -7,25 +7,26 @@ var ErrSumNotSupported = errors.New("no such hash registered") // constants const ( - IDENTITY = 0x00 - SHA1 = 0x11 - SHA2_224 = 0x1013 - SHA2_256 = 0x12 - SHA2_384 = 0x20 - SHA2_512 = 0x13 - SHA2_512_224 = 0x1014 - SHA2_512_256 = 0x1015 - SHA3_224 = 0x17 - SHA3_256 = 0x16 - SHA3_384 = 0x15 - SHA3_512 = 0x14 - KECCAK_224 = 0x1A - KECCAK_256 = 0x1B - KECCAK_384 = 0x1C - KECCAK_512 = 0x1D - BLAKE3 = 0x1E - SHAKE_128 = 0x18 - SHAKE_256 = 0x19 - MD5 = 0xd5 - DBL_SHA2_256 = 0x56 + IDENTITY = 0x00 + SHA1 = 0x11 + SHA2_224 = 0x1013 + SHA2_256 = 0x12 + SHA2_384 = 0x20 + SHA2_512 = 0x13 + SHA2_512_224 = 0x1014 + SHA2_512_256 = 0x1015 + SHA3_224 = 0x17 + SHA3_256 = 0x16 + SHA3_384 = 0x15 + SHA3_512 = 0x14 + KECCAK_224 = 0x1A + KECCAK_256 = 0x1B + KECCAK_384 = 0x1C + KECCAK_512 = 0x1D + BLAKE3 = 0x1E + SHAKE_128 = 0x18 + SHAKE_256 = 0x19 + MURMUR3X64_64 = 0x22 + MD5 = 0xd5 + DBL_SHA2_256 = 0x56 ) diff --git a/go.mod b/go.mod index 9b54c9c..1baf4b6 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ require ( github.com/minio/sha256-simd v1.0.0 github.com/mr-tron/base58 v1.2.0 github.com/multiformats/go-varint v0.0.6 + github.com/spaolacci/murmur3 v1.1.0 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 // indirect lukechampine.com/blake3 v1.1.6 diff --git a/go.sum b/go.sum index 94e767d..42a516e 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= diff --git a/multihash.go b/multihash.go index 49c87a0..42ab977 100644 --- a/multihash.go +++ b/multihash.go @@ -65,9 +65,9 @@ const ( DBL_SHA2_256 = 0x56 - MURMUR3_128 = 0x22 - // Deprecated: use MURMUR3_128 - MURMUR3 = MURMUR3_128 + MURMUR3X64_64 = 0x22 + // Deprecated: use MURMUR3X64_64 + MURMUR3 = MURMUR3X64_64 SHA2_256_TRUNC254_PADDED = 0x1012 X11 = 0x1100 @@ -104,7 +104,7 @@ var Names = map[string]uint64{ "sha3-384": SHA3_384, "sha3-512": SHA3_512, "dbl-sha2-256": DBL_SHA2_256, - "murmur3-128": MURMUR3_128, + "murmur3-x64-64": MURMUR3X64_64, "keccak-224": KECCAK_224, "keccak-256": KECCAK_256, "keccak-384": KECCAK_384, @@ -129,7 +129,7 @@ var Codes = map[uint64]string{ SHA3_384: "sha3-384", SHA3_512: "sha3-512", DBL_SHA2_256: "dbl-sha2-256", - MURMUR3_128: "murmur3-128", + MURMUR3X64_64: "murmur3-x64-64", KECCAK_224: "keccak-224", KECCAK_256: "keccak-256", KECCAK_384: "keccak-384", diff --git a/multihash_test.go b/multihash_test.go index 6194924..528613e 100644 --- a/multihash_test.go +++ b/multihash_test.go @@ -23,7 +23,7 @@ var tCodes = map[uint64]string{ 0x16: "sha3-256", 0x17: "sha3-224", 0x56: "dbl-sha2-256", - 0x22: "murmur3-128", + 0x22: "murmur3-x64-64", 0x1A: "keccak-224", 0x1B: "keccak-256", 0x1C: "keccak-384", @@ -51,7 +51,7 @@ var testCases = []TestCase{ {"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae", 0x12, "sha2-256"}, {"2c26b46b", 0x12, "sha2-256"}, {"2c26b46b68ffc68ff99b453c1d30413413", 0xb240, "blake2b-512"}, - {"243ddb9e", 0x22, "murmur3-128"}, + {"243ddb9e", 0x22, "murmur3-x64-64"}, {"f00ba4", 0x1b, "keccak-256"}, {"f84e95cb5fbd2038863ab27d3cdeac295ad2d4ab96ad1f4b070c0bf36078ef08", 0x18, "shake-128"}, {"1af97f7818a28edfdfce5ec66dbdc7e871813816d7d585fe1f12475ded5b6502b7723b74e2ee36f2651a10a8eaca72aa9148c3c761aaceac8f6d6cc64381ed39", 0x19, "shake-256"}, diff --git a/register/all/multihash_all.go b/register/all/multihash_all.go index 2a48b71..9a623c5 100644 --- a/register/all/multihash_all.go +++ b/register/all/multihash_all.go @@ -19,5 +19,6 @@ package all import ( _ "github.com/multiformats/go-multihash/register/blake2" _ "github.com/multiformats/go-multihash/register/blake3" + _ "github.com/multiformats/go-multihash/register/murmur3" _ "github.com/multiformats/go-multihash/register/sha3" ) diff --git a/register/murmur3/multihash_murmur3.go b/register/murmur3/multihash_murmur3.go new file mode 100644 index 0000000..cdf6d69 --- /dev/null +++ b/register/murmur3/multihash_murmur3.go @@ -0,0 +1,40 @@ +/* + This package has no purpose except to perform registration of multihashes. + + It is meant to be used as a side-effecting import, e.g. + + import ( + _ "github.com/multiformats/go-multihash/register/murmur3" + ) + + This package registers multihashes for murmur3 +*/ +package murmur3 + +import ( + "hash" + + multihash "github.com/multiformats/go-multihash/core" + "github.com/spaolacci/murmur3" +) + +func init() { + multihash.Register(multihash.MURMUR3X64_64, func() hash.Hash { return murmur64{murmur3.New64()} }) +} + +// A wrapper is needed to export the correct size, because murmur3 incorrectly advertises Hash64 as a 128bit hash. +type murmur64 struct { + hash.Hash64 +} + +func (murmur64) BlockSize() int { + return 1 +} + +func (x murmur64) Size() int { + return 8 +} + +func (x murmur64) Sum(digest []byte) []byte { + return x.Hash64.Sum(digest) +} diff --git a/spec/multicodec b/spec/multicodec index bf5c480..36789e0 160000 --- a/spec/multicodec +++ b/spec/multicodec @@ -1 +1 @@ -Subproject commit bf5c4806e71d462d1ac9f232fef3b70e1a5c6dc4 +Subproject commit 36789e0856be22fa02f4dc55582ec670b2b4318b diff --git a/spec_test.go b/spec_test.go index 592f7be..642bac1 100644 --- a/spec_test.go +++ b/spec_test.go @@ -21,7 +21,7 @@ func TestSpec(t *testing.T) { reader := csv.NewReader(file) reader.LazyQuotes = false - reader.FieldsPerRecord = 4 + reader.FieldsPerRecord = 5 reader.TrimLeadingSpace = true values, err := reader.ReadAll()