mirror of
https://github.com/vbatts/merkle.git
synced 2025-04-23 15:24:37 +00:00
.: checksum for an unbalanced tree
This commit is contained in:
parent
205a82f081
commit
da81f82e13
2 changed files with 39 additions and 37 deletions
40
node_test.go
40
node_test.go
|
@ -1,7 +1,7 @@
|
||||||
package merkle
|
package merkle
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
@ -12,6 +12,7 @@ func TestNodeSums(t *testing.T) {
|
||||||
var (
|
var (
|
||||||
nodes []*Node
|
nodes []*Node
|
||||||
h = DefaultHash.New()
|
h = DefaultHash.New()
|
||||||
|
expectedChecksum = "819fe8fed7a46900bd0613344c5ba2be336c74db"
|
||||||
)
|
)
|
||||||
for _, word := range strings.Split(words, " ") {
|
for _, word := range strings.Split(words, " ") {
|
||||||
h.Reset()
|
h.Reset()
|
||||||
|
@ -28,39 +29,14 @@ func TestNodeSums(t *testing.T) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := range nodes {
|
if len(nodes) != 1 {
|
||||||
c, err := nodes[i].Checksum()
|
t.Errorf("%d nodes", len(nodes))
|
||||||
|
}
|
||||||
|
c, err := nodes[0].Checksum()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
t.Logf("checksum %x", c)
|
if gotChecksum := fmt.Sprintf("%x", c); gotChecksum != expectedChecksum {
|
||||||
}
|
t.Errorf("expected checksum %q, got %q", expectedChecksum, gotChecksum)
|
||||||
if len(nodes) > 0 {
|
|
||||||
t.Errorf("%d nodes; %d characters", len(nodes), len(words))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func levelUp(nodes []*Node) []*Node {
|
|
||||||
var (
|
|
||||||
newNodes []*Node
|
|
||||||
last = len(nodes) - 1
|
|
||||||
)
|
|
||||||
|
|
||||||
for i := range nodes {
|
|
||||||
if i%2 == 0 {
|
|
||||||
if i == last {
|
|
||||||
// TODO rebalance the last parent
|
|
||||||
log.Println("WHOOP")
|
|
||||||
}
|
|
||||||
n := NewNode()
|
|
||||||
n.Left = nodes[i]
|
|
||||||
n.Left.Parent = n
|
|
||||||
newNodes = append(newNodes, n)
|
|
||||||
} else {
|
|
||||||
n := newNodes[len(newNodes)-1]
|
|
||||||
n.Right = nodes[i]
|
|
||||||
n.Right.Parent = n
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newNodes
|
|
||||||
}
|
|
||||||
|
|
28
tree.go
28
tree.go
|
@ -1,5 +1,31 @@
|
||||||
package merkle
|
package merkle
|
||||||
|
|
||||||
type Tree struct {
|
type Tree struct {
|
||||||
Nodes []Node
|
Nodes []*Node
|
||||||
|
}
|
||||||
|
|
||||||
|
func levelUp(nodes []*Node) []*Node {
|
||||||
|
var (
|
||||||
|
newNodes []*Node
|
||||||
|
last = len(nodes) - 1
|
||||||
|
)
|
||||||
|
|
||||||
|
for i := range nodes {
|
||||||
|
if i%2 == 0 {
|
||||||
|
if i == last {
|
||||||
|
// last nodes on uneven node counts get pushed up, to be in the next level up
|
||||||
|
newNodes = append(newNodes, nodes[i])
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
n := NewNode()
|
||||||
|
n.Left = nodes[i]
|
||||||
|
n.Left.Parent = n
|
||||||
|
newNodes = append(newNodes, n)
|
||||||
|
} else {
|
||||||
|
n := newNodes[len(newNodes)-1]
|
||||||
|
n.Right = nodes[i]
|
||||||
|
n.Right.Parent = n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newNodes
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue