65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Package xxhash provides a wrapper around the xxhash library for attribute hashing.
|
|
package xxhash // import "go.opentelemetry.io/otel/attribute/internal/xxhash"
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"math"
|
|
|
|
"github.com/cespare/xxhash/v2"
|
|
)
|
|
|
|
// Hash wraps xxhash.Digest to provide an API friendly for hashing attribute values.
|
|
type Hash struct {
|
|
d *xxhash.Digest
|
|
}
|
|
|
|
// New returns a new initialized xxHash64 hasher.
|
|
func New() Hash {
|
|
return Hash{d: xxhash.New()}
|
|
}
|
|
|
|
func (h Hash) Uint64(val uint64) Hash {
|
|
var buf [8]byte
|
|
binary.LittleEndian.PutUint64(buf[:], val)
|
|
// errors from Write are always nil for xxhash
|
|
// if it returns an err then panic
|
|
_, err := h.d.Write(buf[:])
|
|
if err != nil {
|
|
panic("xxhash write of uint64 failed: " + err.Error())
|
|
}
|
|
return h
|
|
}
|
|
|
|
func (h Hash) Bool(val bool) Hash { // nolint:revive // This is a hashing function.
|
|
if val {
|
|
return h.Uint64(1)
|
|
}
|
|
return h.Uint64(0)
|
|
}
|
|
|
|
func (h Hash) Float64(val float64) Hash {
|
|
return h.Uint64(math.Float64bits(val))
|
|
}
|
|
|
|
func (h Hash) Int64(val int64) Hash {
|
|
return h.Uint64(uint64(val)) // nolint:gosec // Overflow doesn't matter since we are hashing.
|
|
}
|
|
|
|
func (h Hash) String(val string) Hash {
|
|
// errors from WriteString are always nil for xxhash
|
|
// if it returns an err then panic
|
|
_, err := h.d.WriteString(val)
|
|
if err != nil {
|
|
panic("xxhash write of string failed: " + err.Error())
|
|
}
|
|
return h
|
|
}
|
|
|
|
// Sum64 returns the current hash value.
|
|
func (h Hash) Sum64() uint64 {
|
|
return h.d.Sum64()
|
|
}
|