forked from open-telemetry/opentelemetry-collector-contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hasher.go
71 lines (63 loc) · 1.91 KB
/
hasher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package attraction // import "github.com/asserts/opentelemetry-collector-contrib/internal/coreinternal/attraction"
import (
"crypto/sha1" // #nosec
"encoding/binary"
"encoding/hex"
"math"
"go.opentelemetry.io/collector/pdata/pcommon"
)
const (
int64ByteSize = 8
float64ByteSize = 8
)
var (
byteTrue = [1]byte{1}
byteFalse = [1]byte{0}
)
// sha1Hasher hashes an AttributeValue using SHA1 and returns a
// hashed version of the attribute. In practice, this would mostly be used
// for string attributes but we support all types for completeness/correctness
// and eliminate any surprises.
func sha1Hasher(attr pcommon.Value) {
var val []byte
switch attr.Type() {
case pcommon.ValueTypeStr:
val = []byte(attr.Str())
case pcommon.ValueTypeBool:
if attr.Bool() {
val = byteTrue[:]
} else {
val = byteFalse[:]
}
case pcommon.ValueTypeInt:
val = make([]byte, int64ByteSize)
binary.LittleEndian.PutUint64(val, uint64(attr.Int()))
case pcommon.ValueTypeDouble:
val = make([]byte, float64ByteSize)
binary.LittleEndian.PutUint64(val, math.Float64bits(attr.Double()))
}
var hashed string
if len(val) > 0 {
// #nosec
h := sha1.New()
_, _ = h.Write(val)
val = h.Sum(nil)
hashedBytes := make([]byte, hex.EncodedLen(len(val)))
hex.Encode(hashedBytes, val)
hashed = string(hashedBytes)
}
attr.SetStr(hashed)
}