github.com/hellobchain/third_party@v0.0.0-20230331131523-deb0478a2e52/prometheus/common/model/fingerprinting.go (about) 1 // Copyright 2013 The Prometheus Authors 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package model 15 16 import ( 17 "fmt" 18 "strconv" 19 ) 20 21 // Fingerprint provides a hash-capable representation of a Metric. 22 // For our purposes, FNV-1A 64-bit is used. 23 type Fingerprint uint64 24 25 // FingerprintFromString transforms a string representation into a Fingerprint. 26 func FingerprintFromString(s string) (Fingerprint, error) { 27 num, err := strconv.ParseUint(s, 16, 64) 28 return Fingerprint(num), err 29 } 30 31 // ParseFingerprint parses the input string into a fingerprint. 32 func ParseFingerprint(s string) (Fingerprint, error) { 33 num, err := strconv.ParseUint(s, 16, 64) 34 if err != nil { 35 return 0, err 36 } 37 return Fingerprint(num), nil 38 } 39 40 func (f Fingerprint) String() string { 41 return fmt.Sprintf("%016x", uint64(f)) 42 } 43 44 // Fingerprints represents a collection of Fingerprint subject to a given 45 // natural sorting scheme. It implements sort.Interface. 46 type Fingerprints []Fingerprint 47 48 // Len implements sort.Interface. 49 func (f Fingerprints) Len() int { 50 return len(f) 51 } 52 53 // Less implements sort.Interface. 54 func (f Fingerprints) Less(i, j int) bool { 55 return f[i] < f[j] 56 } 57 58 // Swap implements sort.Interface. 59 func (f Fingerprints) Swap(i, j int) { 60 f[i], f[j] = f[j], f[i] 61 } 62 63 // FingerprintSet is a set of Fingerprints. 64 type FingerprintSet map[Fingerprint]struct{} 65 66 // Equal returns true if both sets contain the same elements (and not more). 67 func (s FingerprintSet) Equal(o FingerprintSet) bool { 68 if len(s) != len(o) { 69 return false 70 } 71 72 for k := range s { 73 if _, ok := o[k]; !ok { 74 return false 75 } 76 } 77 78 return true 79 } 80 81 // Intersection returns the elements contained in both sets. 82 func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { 83 myLength, otherLength := len(s), len(o) 84 if myLength == 0 || otherLength == 0 { 85 return FingerprintSet{} 86 } 87 88 subSet := s 89 superSet := o 90 91 if otherLength < myLength { 92 subSet = o 93 superSet = s 94 } 95 96 out := FingerprintSet{} 97 98 for k := range subSet { 99 if _, ok := superSet[k]; ok { 100 out[k] = struct{}{} 101 } 102 } 103 104 return out 105 }