diff --git a/structure/type.go b/structure/type.go index 3411aad81703d..a79ef76350130 100644 --- a/structure/type.go +++ b/structure/type.go @@ -49,14 +49,14 @@ func (t *TxStructure) encodeStringDataKey(key []byte) kv.Key { } func (t *TxStructure) encodeHashMetaKey(key []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+24) + ek := make([]byte, 0, len(t.prefix)+codec.EncodedBytesLength(len(key))+8) ek = append(ek, t.prefix...) ek = codec.EncodeBytes(ek, key) return codec.EncodeUint(ek, uint64(HashMeta)) } func (t *TxStructure) encodeHashDataKey(key []byte, field []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+len(field)+30) + ek := make([]byte, 0, len(t.prefix)+codec.EncodedBytesLength(len(key))+8+codec.EncodedBytesLength(len(field))) ek = append(ek, t.prefix...) ek = codec.EncodeBytes(ek, key) ek = codec.EncodeUint(ek, uint64(HashData)) diff --git a/util/codec/bytes.go b/util/codec/bytes.go index 9ef8519dfb600..118c01ba0d1c8 100644 --- a/util/codec/bytes.go +++ b/util/codec/bytes.go @@ -67,6 +67,13 @@ func EncodeBytes(b []byte, data []byte) []byte { return result } +// EncodedBytesLength returns the length of data after encoded +func EncodedBytesLength(dataLen int) int { + mod := dataLen % encGroupSize + padCount := encGroupSize - mod + return dataLen + padCount + 1 + dataLen/encGroupSize +} + func decodeBytes(b []byte, buf []byte, reverse bool) ([]byte, []byte, error) { if buf == nil { buf = make([]byte, 0, len(b)) diff --git a/util/codec/bytes_test.go b/util/codec/bytes_test.go index 00b482e538141..68083040567d4 100644 --- a/util/codec/bytes_test.go +++ b/util/codec/bytes_test.go @@ -49,6 +49,9 @@ func (s *testBytesSuite) TestBytesCodec(c *C) { } for _, input := range inputs { + + c.Assert(EncodedBytesLength(len(input.enc)), Equals, len(input.dec)) + if input.desc { b := EncodeBytesDesc(nil, input.enc) c.Assert(b, BytesEquals, input.dec)