Source File
hash.go
Belonging Package
go.opentelemetry.io/otel/attribute
// Copyright The OpenTelemetry Authors// SPDX-License-Identifier: Apache-2.0package attribute // import "go.opentelemetry.io/otel/attribute"import ()// Type identifiers. These identifiers are hashed before the value of the// corresponding type. This is done to distinguish values that are hashed with// the same value representation (e.g. `int64(1)` and `true`, []int64{0} and// int64(0)).//// These are all 8 byte length strings converted to a uint64 representation. A// uint64 is used instead of the string directly as an optimization, it avoids// the for loop in [xxhash] which adds minor overhead.const (boolID uint64 = 7953749933313450591 // "_boolean" (little endian)int64ID uint64 = 7592915492740740150 // "64_bit_i" (little endian)float64ID uint64 = 7376742710626956342 // "64_bit_f" (little endian)stringID uint64 = 6874584755375207263 // "_string_" (little endian)boolSliceID uint64 = 6875993255270243167 // "_[]bool_" (little endian)int64SliceID uint64 = 3762322556277578591 // "_[]int64" (little endian)float64SliceID uint64 = 7308324551835016539 // "[]double" (little endian)stringSliceID uint64 = 7453010373645655387 // "[]string" (little endian))// hashKVs returns a new xxHash64 hash of kvs.func hashKVs( []KeyValue) uint64 {:= xxhash.New()for , := range {= hashKV(, )}return .Sum64()}// hashKV returns the xxHash64 hash of kv with h as the base.func hashKV( xxhash.Hash, KeyValue) xxhash.Hash {= .String(string(.Key))switch .Value.Type() {case BOOL:= .Uint64(boolID)= .Uint64(.Value.numeric)case INT64:= .Uint64(int64ID)= .Uint64(.Value.numeric)case FLOAT64:= .Uint64(float64ID)// Assumes numeric stored with math.Float64bits.= .Uint64(.Value.numeric)case STRING:= .Uint64(stringID)= .String(.Value.stringly)case BOOLSLICE:= .Uint64(boolSliceID):= reflect.ValueOf(.Value.slice)for := 0; < .Len(); ++ {= .Bool(.Index().Bool())}case INT64SLICE:= .Uint64(int64SliceID):= reflect.ValueOf(.Value.slice)for := 0; < .Len(); ++ {= .Int64(.Index().Int())}case FLOAT64SLICE:= .Uint64(float64SliceID):= reflect.ValueOf(.Value.slice)for := 0; < .Len(); ++ {= .Float64(.Index().Float())}case STRINGSLICE:= .Uint64(stringSliceID):= reflect.ValueOf(.Value.slice)for := 0; < .Len(); ++ {= .String(.Index().String())}case INVALID:default:// Logging is an alternative, but using the internal logger here// causes an import cycle so it is not done.:= .Value.AsInterface():= fmt.Sprintf("unknown value type: %[1]v (%[1]T)", )panic()}return}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |