mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 21:54:10 -08:00
make hashmod a lot easier to read and a little faster (#11551)
Previous code was effectively doing BigEndian.Uint64, so call that and save time. An md5.Sum result is always 16 bytes. The first 8 are not used in the result, just as before. Signed-off-by: Renning Bruns <ren@renmail.net>
This commit is contained in:
parent
53bb046d21
commit
5ec1b4baaf
|
@ -15,6 +15,7 @@ package relabel
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -268,7 +269,9 @@ func relabel(lset labels.Labels, cfg *Config, lb *labels.Builder) (ret labels.La
|
||||||
case Uppercase:
|
case Uppercase:
|
||||||
lb.Set(cfg.TargetLabel, strings.ToUpper(val))
|
lb.Set(cfg.TargetLabel, strings.ToUpper(val))
|
||||||
case HashMod:
|
case HashMod:
|
||||||
mod := sum64(md5.Sum([]byte(val))) % cfg.Modulus
|
hash := md5.Sum([]byte(val))
|
||||||
|
// Use only the last 8 bytes of the hash to give the same result as earlier versions of this code.
|
||||||
|
mod := binary.BigEndian.Uint64(hash[8:]) % cfg.Modulus
|
||||||
lb.Set(cfg.TargetLabel, fmt.Sprintf("%d", mod))
|
lb.Set(cfg.TargetLabel, fmt.Sprintf("%d", mod))
|
||||||
case LabelMap:
|
case LabelMap:
|
||||||
lset.Range(func(l labels.Label) {
|
lset.Range(func(l labels.Label) {
|
||||||
|
@ -295,15 +298,3 @@ func relabel(lset labels.Labels, cfg *Config, lb *labels.Builder) (ret labels.La
|
||||||
|
|
||||||
return lb.Labels(lset), true
|
return lb.Labels(lset), true
|
||||||
}
|
}
|
||||||
|
|
||||||
// sum64 sums the md5 hash to an uint64.
|
|
||||||
func sum64(hash [md5.Size]byte) uint64 {
|
|
||||||
var s uint64
|
|
||||||
|
|
||||||
for i, b := range hash {
|
|
||||||
shift := uint64((md5.Size - i - 1) * 8)
|
|
||||||
|
|
||||||
s |= uint64(b) << shift
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue