| 1234567891011121314151617181920212223242526272829303132333435 |
- package cat
- import (
- "crypto/md5"
- "encoding/binary"
- "fmt"
- "regexp"
- )
- var pathHashValidator = regexp.MustCompile("^[0-9a-f]{8}$")
- // GeneratePathHash generates a path hash given a referring path hash,
- // transaction name, and application name. referringPathHash can be an empty
- // string if there was no referring path hash.
- func GeneratePathHash(referringPathHash, txnName, appName string) (string, error) {
- var rph uint32
- if referringPathHash != "" {
- if !pathHashValidator.MatchString(referringPathHash) {
- // Per the spec, invalid referring path hashes should be treated as "0".
- referringPathHash = "0"
- }
- if _, err := fmt.Sscanf(referringPathHash, "%x", &rph); err != nil {
- fmt.Println(rph)
- return "", err
- }
- rph = (rph << 1) | (rph >> 31)
- }
- hashInput := fmt.Sprintf("%s;%s", appName, txnName)
- hash := md5.Sum([]byte(hashInput))
- low32 := binary.BigEndian.Uint32(hash[12:])
- return fmt.Sprintf("%08x", rph^low32), nil
- }
|