1
0

path_hash.go 957 B

1234567891011121314151617181920212223242526272829303132333435
  1. package cat
  2. import (
  3. "crypto/md5"
  4. "encoding/binary"
  5. "fmt"
  6. "regexp"
  7. )
  8. var pathHashValidator = regexp.MustCompile("^[0-9a-f]{8}$")
  9. // GeneratePathHash generates a path hash given a referring path hash,
  10. // transaction name, and application name. referringPathHash can be an empty
  11. // string if there was no referring path hash.
  12. func GeneratePathHash(referringPathHash, txnName, appName string) (string, error) {
  13. var rph uint32
  14. if referringPathHash != "" {
  15. if !pathHashValidator.MatchString(referringPathHash) {
  16. // Per the spec, invalid referring path hashes should be treated as "0".
  17. referringPathHash = "0"
  18. }
  19. if _, err := fmt.Sscanf(referringPathHash, "%x", &rph); err != nil {
  20. fmt.Println(rph)
  21. return "", err
  22. }
  23. rph = (rph << 1) | (rph >> 31)
  24. }
  25. hashInput := fmt.Sprintf("%s;%s", appName, txnName)
  26. hash := md5.Sum([]byte(hashInput))
  27. low32 := binary.BigEndian.Uint32(hash[12:])
  28. return fmt.Sprintf("%08x", rph^low32), nil
  29. }