mirror of
https://github.com/NotAShelf/goblin.git
synced 2024-11-23 05:40:45 +00:00
73 lines
2.3 KiB
Markdown
73 lines
2.3 KiB
Markdown
|
# xxhash
|
||
|
|
||
|
[![Go Reference](https://pkg.go.dev/badge/github.com/cespare/xxhash/v2.svg)](https://pkg.go.dev/github.com/cespare/xxhash/v2)
|
||
|
[![Test](https://github.com/cespare/xxhash/actions/workflows/test.yml/badge.svg)](https://github.com/cespare/xxhash/actions/workflows/test.yml)
|
||
|
|
||
|
xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a
|
||
|
high-quality hashing algorithm that is much faster than anything in the Go
|
||
|
standard library.
|
||
|
|
||
|
This package provides a straightforward API:
|
||
|
|
||
|
```
|
||
|
func Sum64(b []byte) uint64
|
||
|
func Sum64String(s string) uint64
|
||
|
type Digest struct{ ... }
|
||
|
func New() *Digest
|
||
|
```
|
||
|
|
||
|
The `Digest` type implements hash.Hash64. Its key methods are:
|
||
|
|
||
|
```
|
||
|
func (*Digest) Write([]byte) (int, error)
|
||
|
func (*Digest) WriteString(string) (int, error)
|
||
|
func (*Digest) Sum64() uint64
|
||
|
```
|
||
|
|
||
|
The package is written with optimized pure Go and also contains even faster
|
||
|
assembly implementations for amd64 and arm64. If desired, the `purego` build tag
|
||
|
opts into using the Go code even on those architectures.
|
||
|
|
||
|
[xxHash]: http://cyan4973.github.io/xxHash/
|
||
|
|
||
|
## Compatibility
|
||
|
|
||
|
This package is in a module and the latest code is in version 2 of the module.
|
||
|
You need a version of Go with at least "minimal module compatibility" to use
|
||
|
github.com/cespare/xxhash/v2:
|
||
|
|
||
|
* 1.9.7+ for Go 1.9
|
||
|
* 1.10.3+ for Go 1.10
|
||
|
* Go 1.11 or later
|
||
|
|
||
|
I recommend using the latest release of Go.
|
||
|
|
||
|
## Benchmarks
|
||
|
|
||
|
Here are some quick benchmarks comparing the pure-Go and assembly
|
||
|
implementations of Sum64.
|
||
|
|
||
|
| input size | purego | asm |
|
||
|
| ---------- | --------- | --------- |
|
||
|
| 4 B | 1.3 GB/s | 1.2 GB/s |
|
||
|
| 16 B | 2.9 GB/s | 3.5 GB/s |
|
||
|
| 100 B | 6.9 GB/s | 8.1 GB/s |
|
||
|
| 4 KB | 11.7 GB/s | 16.7 GB/s |
|
||
|
| 10 MB | 12.0 GB/s | 17.3 GB/s |
|
||
|
|
||
|
These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C
|
||
|
CPU using the following commands under Go 1.19.2:
|
||
|
|
||
|
```
|
||
|
benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$')
|
||
|
benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$')
|
||
|
```
|
||
|
|
||
|
## Projects using this package
|
||
|
|
||
|
- [InfluxDB](https://github.com/influxdata/influxdb)
|
||
|
- [Prometheus](https://github.com/prometheus/prometheus)
|
||
|
- [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics)
|
||
|
- [FreeCache](https://github.com/coocood/freecache)
|
||
|
- [FastCache](https://github.com/VictoriaMetrics/fastcache)
|