我正在使用levigo,即 Go 的 leveldb 绑定。我的钥匙是int64
's 并且需要保持排序。默认情况下,leveldb 使用字节比较器,所以我尝试使用 varint 编码。
func i2b(x int64) []byte {
b := make([]byte, binary.MaxVarintLen64)
n := binary.PutVarint(b, x)
return key[:n]
}
我的钥匙没有被正确排序。我写了以下内容作为测试。
var prev int64 = 0
for i := int64(1); i < 1e5; i++ {
if bytes.Compare(i2b(i), i2b(prev)) <= 0 {
log.Fatalf("bytewise: %d > %d", b2i(prev), i)
}
prev = i
}
输出: bytewise: 127 > 128
我不确定问题出在哪里。我做错编码了吗?varint 不是正确的编码吗?
编辑:
BigEndian 固定宽度编码是按字节可比的
func i2b(x int64) []byte {
b := make([]byte, 8)
binary.BigEndian.PutUint64(b, uint64(x))
return b
}