From 8f7b37bab5a8a698e72a40ca94722af17bc675e7 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Thu, 25 Feb 2021 17:38:21 -0800 Subject: [PATCH] feat(cid): add FromDigest for previously computed hash --- cid.go | 9 ++++++++- cid_test.go | 30 ++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 3 +++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/cid.go b/cid.go index 2c4fd22..a915a25 100644 --- a/cid.go +++ b/cid.go @@ -573,8 +573,15 @@ func (p Prefix) Sum(data []byte) (Cid, error) { return Undef, fmt.Errorf("invalid v0 prefix") } + digest, err := mh.Digest(data, p.MhType, length) + if err != nil { + return Undef, err + } + return p.FromDigest(digest) +} - hash, err := mh.Sum(data, p.MhType, length) +func (p Prefix) FromDigest(digest []byte) (Cid, error) { + hash, err := mh.Encode(digest, p.MhType) if err != nil { return Undef, err } diff --git a/cid_test.go b/cid_test.go index 159ded8..1907ba7 100644 --- a/cid_test.go +++ b/cid_test.go @@ -105,7 +105,37 @@ func TestPrefixSum(t *testing.T) { } } } +func TestPrefixDigest(t *testing.T) { + // Test creating CIDs both manually and with Prefix. + // Tests: https://github.com/ipfs/go-cid/issues/83 + for _, hashfun := range []uint64{ + mh.ID, mh.SHA3, mh.SHA2_256, + } { + h1, err := mh.Sum([]byte("TEST"), hashfun, -1) + if err != nil { + t.Fatal(err) + } + c1 := NewCidV1(Raw, h1) + h2, err := mh.Sum([]byte("foobar"), hashfun, -1) + if err != nil { + t.Fatal(err) + } + c2 := NewCidV1(Raw, h2) + + digest, err := mh.Digest([]byte("foobar"), hashfun, -1) + if err != nil { + t.Fatal(err) + } + c3, err := c1.Prefix().FromDigest(digest) + if err != nil { + t.Fatal(err) + } + if !c2.Equals(c3) { + t.Fatal("expected CIDs to be equal") + } + } +} func TestBasicMarshaling(t *testing.T) { h, err := mh.Sum([]byte("TEST"), mh.SHA3, 4) if err != nil { diff --git a/go.mod b/go.mod index 68c91a1..d3a217c 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/ipfs/go-cid require ( github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.14 + github.com/multiformats/go-multihash v0.0.15-0.20210226003459-69a4fed1d6f2 github.com/multiformats/go-varint v0.0.6 ) diff --git a/go.sum b/go.sum index b7d4586..7ffc6a1 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,11 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multihash v0.0.13 h1:06x+mk/zj1FoMsgNejLpy6QTvJqlSt/BhLEy87zidlc= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= +github.com/multiformats/go-multihash v0.0.15-0.20210226003459-69a4fed1d6f2 h1:0DZ3ybel2YfQ4L9GrglYgfXxdXVT8CVkJt//crxSQDM= +github.com/multiformats/go-multihash v0.0.15-0.20210226003459-69a4fed1d6f2/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-varint v0.0.5 h1:XVZwSo04Cs3j/jS0uAEPpT3JY6DzMcVLLoWOSnCxOjg= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +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=