.: checksum for an unbalanced tree

This commit is contained in:
Vincent Batts 2015-03-17 17:27:39 -04:00
parent 205a82f081
commit da81f82e13
2 changed files with 39 additions and 37 deletions

View File

@ -1,7 +1,7 @@
package merkle package merkle
import ( import (
"log" "fmt"
"strings" "strings"
"testing" "testing"
) )
@ -10,8 +10,9 @@ var words string = `Who were expelled from the academy for crazy & publishing ob
func TestNodeSums(t *testing.T) { 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))
if err != nil {
t.Error(err)
}
t.Logf("checksum %x", c)
} }
if len(nodes) > 0 { c, err := nodes[0].Checksum()
t.Errorf("%d nodes; %d characters", len(nodes), len(words)) if err != nil {
t.Error(err)
}
if gotChecksum := fmt.Sprintf("%x", c); gotChecksum != expectedChecksum {
t.Errorf("expected checksum %q, got %q", expectedChecksum, gotChecksum)
} }
} }
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
View File

@ -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
} }