64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/peterbourgon/diskv"
|
|
)
|
|
|
|
const transformBlockSize = 2 // grouping of chars per directory depth
|
|
|
|
func blockTransform(s string) []string {
|
|
var (
|
|
sliceSize = len(s) / transformBlockSize
|
|
pathSlice = make([]string, sliceSize)
|
|
)
|
|
for i := 0; i < sliceSize; i++ {
|
|
from, to := i*transformBlockSize, (i*transformBlockSize)+transformBlockSize
|
|
pathSlice[i] = s[from:to]
|
|
}
|
|
return pathSlice
|
|
}
|
|
|
|
func main() {
|
|
d := diskv.New(diskv.Options{
|
|
BasePath: "data",
|
|
Transform: blockTransform,
|
|
CacheSizeMax: 1024 * 1024, // 1MB
|
|
})
|
|
|
|
for _, valueStr := range []string{
|
|
"I am the very model of a modern Major-General",
|
|
"I've information vegetable, animal, and mineral",
|
|
"I know the kings of England, and I quote the fights historical",
|
|
"From Marathon to Waterloo, in order categorical",
|
|
"I'm very well acquainted, too, with matters mathematical",
|
|
"I understand equations, both the simple and quadratical",
|
|
"About binomial theorem I'm teeming with a lot o' news",
|
|
"With many cheerful facts about the square of the hypotenuse",
|
|
} {
|
|
d.Write(md5sum(valueStr), []byte(valueStr))
|
|
}
|
|
|
|
var keyCount int
|
|
for key := range d.Keys(nil) {
|
|
val, err := d.Read(key)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("key %s had no value", key))
|
|
}
|
|
fmt.Printf("%s: %s\n", key, val)
|
|
keyCount++
|
|
}
|
|
fmt.Printf("%d total keys\n", keyCount)
|
|
|
|
// d.EraseAll() // leave it commented out to see how data is kept on disk
|
|
}
|
|
|
|
func md5sum(s string) string {
|
|
h := md5.New()
|
|
io.WriteString(h, s)
|
|
return fmt.Sprintf("%x", h.Sum(nil))
|
|
}
|