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:
Renning Bruns 2023-02-28 09:36:58 -08:00 committed by GitHub
parent 53bb046d21
commit 5ec1b4baaf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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
}