Last active
September 22, 2021 14:15
-
-
Save eduardonunesp/d6c717fe64212832720905b6d4332d8b to your computer and use it in GitHub Desktop.
Basic HAMT (Hash array mapped trie) using golang module github.com/ipld/go-ipld-adl-hamt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bytes" | |
"fmt" | |
"io" | |
"github.com/davecgh/go-spew/spew" | |
"github.com/ipfs/go-cid" | |
hamt "github.com/ipld/go-ipld-adl-hamt" | |
ipld "github.com/ipld/go-ipld-prime" | |
_ "github.com/ipld/go-ipld-prime/codec/dagcbor" | |
cidlink "github.com/ipld/go-ipld-prime/linking/cid" | |
"github.com/multiformats/go-multicodec" | |
) | |
func errCheck(err error) { | |
if err != nil { | |
panic(err) | |
} | |
} | |
func createMapNode() (ipld.Node, error) { | |
linkSystem := cidlink.DefaultLinkSystem() | |
linkProto := cidlink.LinkPrototype{Prefix: cid.Prefix{ | |
Version: 1, // Usually '1'. | |
Codec: uint64(multicodec.DagCbor), | |
MhType: uint64(multicodec.Sha2_512), | |
MhLength: 64, // sha2-512 hash has a 64-byte sum. | |
}} | |
storage := make(map[ipld.Link][]byte) | |
linkSystem.StorageWriteOpener = func(lctx ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { | |
buf := bytes.Buffer{} | |
return &buf, func(lnk ipld.Link) error { | |
storage[lnk] = buf.Bytes() | |
return nil | |
}, nil | |
} | |
linkSystem.StorageReadOpener = func(_ ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { | |
return bytes.NewReader(storage[lnk]), nil | |
} | |
builder := hamt.NewBuilder(hamt.Prototype{BitWidth: 3, BucketSize: 64}). | |
WithLinking(linkSystem, linkProto) | |
assembler, err := builder.BeginMap(0) | |
if err != nil { | |
return nil, err | |
} | |
const number = int64(20) | |
for i := int64(0); i < number; i++ { | |
s := fmt.Sprintf("%02d", i) | |
err := assembler.AssembleKey().AssignString(s) | |
if err != nil { | |
return nil, err | |
} | |
err = assembler.AssembleValue().AssignString(s) | |
if err != nil { | |
return nil, err | |
} | |
} | |
err = assembler.Finish() | |
if err != nil { | |
return nil, err | |
} | |
return hamt.Build(builder), nil | |
} | |
func main() { | |
node, err := createMapNode() | |
errCheck(err) | |
fmt.Println(spew.Sdump(node)) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(*hamt.Node)(0xc0001aeb18)({ | |
modeFilecoin: (bool) false, | |
_HashMapRoot: (hamt._HashMapRoot) { | |
hashAlg: (hamt._Int) { | |
x: (int64) 34 | |
}, | |
bucketSize: (hamt._Int) { | |
x: (int64) 64 | |
}, | |
hamt: (hamt._HashMapNode) { | |
_map: (hamt._Bytes) { | |
x: ([]uint8) (len=1 cap=1) { | |
00000000 ff |.| | |
} | |
}, | |
data: (hamt._List__Element) { | |
x: ([]hamt._Element) (len=8 cap=8) { | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc0001283c0)({ | |
x: ([]hamt._BucketEntry) (len=1 cap=1) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 33 |03| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc0001199b0)(03) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc000128378)({ | |
x: ([]hamt._BucketEntry) (len=5 cap=8) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 30 |00| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119910)(00) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 35 |05| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119a10)(05) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 38 |08| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119aa0)(08) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 34 |14| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119bc0)(14) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 38 |18| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119c80)(18) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc0001283a8)({ | |
x: ([]hamt._BucketEntry) (len=2 cap=2) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 32 |02| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119980)(02) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 32 |12| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119b60)(12) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc000128390)({ | |
x: ([]hamt._BucketEntry) (len=2 cap=2) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 31 |01| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119950)(01) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 31 |11| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119b30)(11) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc000128420)({ | |
x: ([]hamt._BucketEntry) (len=1 cap=1) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 36 |16| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119c20)(16) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc0001283d8)({ | |
x: ([]hamt._BucketEntry) (len=4 cap=4) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 34 |04| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc0001199e0)(04) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 36 |06| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119a40)(06) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 37 |07| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119a70)(07) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 39 |19| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119cb0)(19) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc000128408)({ | |
x: ([]hamt._BucketEntry) (len=1 cap=1) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 33 |13| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119b90)(13) | |
} | |
} | |
} | |
}) | |
}, | |
(hamt._Element) { | |
x: (*hamt._Bucket)(0xc0001283f0)({ | |
x: ([]hamt._BucketEntry) (len=4 cap=4) { | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 30 39 |09| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119ad0)(09) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 30 |10| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119b00)(10) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 35 |15| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119bf0)(15) | |
} | |
}, | |
(hamt._BucketEntry) { | |
key: (hamt._Bytes) { | |
x: ([]uint8) (len=2 cap=8) { | |
00000000 31 37 |17| | |
} | |
}, | |
value: (hamt._Any) { | |
x: (*hamt._String)(0xc000119c50)(17) | |
} | |
} | |
} | |
}) | |
} | |
} | |
} | |
} | |
}, | |
linkSystem: (ipld.LinkSystem) { | |
EncoderChooser: (func(ipld.LinkPrototype) (ipld.Encoder, error)) 0x12213c0, | |
DecoderChooser: (func(ipld.Link) (ipld.Decoder, error)) 0x1221520, | |
HasherChooser: (func(ipld.LinkPrototype) (hash.Hash, error)) 0x12216a0, | |
StorageWriteOpener: (ipld.BlockWriteOpener) 0x139a3c0, | |
StorageReadOpener: (ipld.BlockReadOpener) 0x139a4a0, | |
TrustedStorage: (bool) false, | |
NodeReifier: (ipld.NodeReifier) <nil> | |
}, | |
linkPrototype: (cidlink.LinkPrototype) { | |
Prefix: (cid.Prefix) { | |
Version: (uint64) 1, | |
Codec: (uint64) 113, | |
MhType: (uint64) 19, | |
MhLength: (int) 64 | |
} | |
} | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment