varint

package module
v0.0.0-...-2049fde Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 7, 2024 License: MIT Imports: 2 Imported by: 1

README

Varint的Go实现

一、这是什么

可变长int的类型,类似于数据库中的varchar类型,正常情况下int是要存储为多个字节的,比如int64,需要8个字节,比如使用int64来存储1这个数字,把对应的int64的这8个字节展开为每一个bit大概是这个样子:

image-20221201004517168

可以看到,只使用了一个bit,其实有效位只有一个bit,其它的都浪费了,varint就是想着尽可能的提高bit的利用率,每个数组不再使用固定的字节数表示,而是需要多长就使用多长,但是这样怎么知道究竟使用了几个字节呢,于是就把byte的最高的一个bit拿出来作为标记位,如果为1则表示后续后续的一个字节还是表示的这个数字,如果为0则表示这个数字已经结束,比如数字1024,则表示为:

image-20221201005133305

这样子只需要两个字节就可以了。

什么样子的数据适合使用varint

值的分布范围很大,并且绝大多数的值都分布在较小的那边,对于这种类型的树,直接使用偏移收缩不合适,直接使用较小的数据类型不合适大的放不下了,那么就是用varint类型,使得绝大多数数据都能消耗较小的空间,并且部分有需要的仍然使用较大的空间。

应用场景

  • 无符号证书持久化存储时节省空间
  • 内存计算节省空间,支持更大规模的计算量

二、安装

go get -u github.com/compression-algorithm-research-lab/go-varint

三、Example

TODO 2022-11-27 21:57:06

Documentation

Index

Constants

View Source
const (

	// VarIntEndByteHighestBitValue 对varint字节数组而言,如果某个字节的最高位的值是0表示这是当前数字variant编码字节数组的最后一个字节
	VarIntEndByteHighestBitValue = 0x0

	// VarIntNotEndByteHighestBitValue 对varint字节数组而言,如果某个字节的最高位的值是1表示这不是当前数字varint编码字节数组的最后一个字节,后面至少还有一个字节
	VarIntNotEndByteHighestBitValue = 0x1
)
View Source
const ByteHighestBit = 0x80

ByteHighestBit 获取byte的最高位

Variables

View Source
var ZeroVarIntBytes = []byte{VarIntNotEndByteHighestBitValue << 7}

0对应的varint编码

Functions

func BenchmarkingValueRatio

func BenchmarkingValueRatio[T gtypes.Unsigned](value T) float64

BenchmarkingValueRatio 计算单个值的压缩率

func BenchmarkingValueSliceRatio

func BenchmarkingValueSliceRatio[T gtypes.Unsigned](valueSlice []T) float64

BenchmarkingValueSliceRatio 计算整个切片的压缩率

func Decode

func Decode[T gtypes.Unsigned](bytes []byte) T

Decode 对varint编码的无符号整数进行解码,一次解码一个

func DecodeChannel

func DecodeChannel[T gtypes.Unsigned](varintBytesChannel <-chan byte, outputChannel chan<- T)

DecodeChannel 通过channel流式解码

func DecodeSlice

func DecodeSlice[T gtypes.Unsigned](bytes []byte) []T

DecodeSlice 当多个无符号整数放在同一个字节切片中时,可以调用这个方法解码

func Encode

func Encode[T gtypes.Unsigned](value T) []byte

Encode 对无符号类型进行编码,注意,如果被编码的数字位数较小可能会越编码越大

func EncodeChannel

func EncodeChannel[T gtypes.Unsigned](valueChannel <-chan T, outputByteChannel chan<- byte)

EncodeChannel 从无符号整数channel中读取数据,varint编码之后发送到字节channel

func EncodeSlice

func EncodeSlice[T gtypes.Unsigned](valueSlice []T) []byte

EncodeSlice 对无符号切片编码,切片中的无符号数字会被挨个存储在返回的字节切片中

Types

type VarInt

type VarInt []byte

VarInt 用于表示一个可变长无符号整数

func From

func From[T gtypes.Unsigned](value T) VarInt

From 从无符号类型创建一个variant

func (*VarInt) Add

func (x *VarInt) Add(v VarInt) VarInt

func (*VarInt) Divide

func (x *VarInt) Divide(v VarInt) VarInt

func (*VarInt) Equals

func (x *VarInt) Equals(v VarInt) bool

func (*VarInt) GreatThan

func (x *VarInt) GreatThan(v VarInt) bool

func (*VarInt) GreatThanOrEquals

func (x *VarInt) GreatThanOrEquals(v VarInt) bool

func (*VarInt) LessThan

func (x *VarInt) LessThan(v VarInt) bool

func (*VarInt) LessThanOrEqual

func (x *VarInt) LessThanOrEqual(v VarInt) bool

func (*VarInt) Multi

func (x *VarInt) Multi(v VarInt) VarInt

func (*VarInt) Sub

func (x *VarInt) Sub(v VarInt) VarInt

func (*VarInt) ToUint

func (x *VarInt) ToUint() uint

func (*VarInt) ToUint64

func (x *VarInt) ToUint64() uint64

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL