github.com/newrelic/go-agent@v3.26.0+incompatible/internal/cat/path_hash.go (about) 1 // Copyright 2020 New Relic Corporation. All rights reserved. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package cat 5 6 import ( 7 "crypto/md5" 8 "encoding/binary" 9 "fmt" 10 "regexp" 11 ) 12 13 var pathHashValidator = regexp.MustCompile("^[0-9a-f]{8}$") 14 15 // GeneratePathHash generates a path hash given a referring path hash, 16 // transaction name, and application name. referringPathHash can be an empty 17 // string if there was no referring path hash. 18 func GeneratePathHash(referringPathHash, txnName, appName string) (string, error) { 19 var rph uint32 20 if referringPathHash != "" { 21 if !pathHashValidator.MatchString(referringPathHash) { 22 // Per the spec, invalid referring path hashes should be treated as "0". 23 referringPathHash = "0" 24 } 25 26 if _, err := fmt.Sscanf(referringPathHash, "%x", &rph); err != nil { 27 fmt.Println(rph) 28 return "", err 29 } 30 rph = (rph << 1) | (rph >> 31) 31 } 32 33 hashInput := fmt.Sprintf("%s;%s", appName, txnName) 34 hash := md5.Sum([]byte(hashInput)) 35 low32 := binary.BigEndian.Uint32(hash[12:]) 36 37 return fmt.Sprintf("%08x", rph^low32), nil 38 }