Я использую levigo, привязки leveldb для Go. Мои ключи: int64
и их нужно сортировать. По умолчанию, leveldb использует bytewise compator, поэтому я пытаюсь использовать varint-кодирование.по аналогии сравнить varint encoded int64's
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
}
обратный 'ключ [: n]' перед возвратом даст правильный результат. Однако у меня нет объяснений, почему. – thwd
@ Настоящая сущность? –
Возможно, вы правы – thwd