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  }