service/cert-signer/cert_signer.go
func computeRoleHash(organizations string) string {
	// Sort organizations alphabetically
	organizationsSlice := strings.Split(organizations, ",")
	sort.Strings(organizationsSlice)
	organizations = strings.Join(organizationsSlice, ",")

	h := sha1.New()
	h.Write([]byte(organizations))
	bs := h.Sum(nil)

	return fmt.Sprintf("%x", bs)
}
func computeRoleHash(organizations string) string {
	// Sort organizations alphabetically
	organizationsSlice := strings.Split(organizations, ",")
	sort.Strings(organizationsSlice)
	organizations = strings.Join(organizationsSlice, ",")

	h := sha1.New()
	h.Write([]byte(organizations))
	bs := h.Sum(nil)

	return fmt.Sprintf("%x", bs)
}
// computeRoleHash computes a hash for the role that can issue these organizations.
// Since we want to reuse roles when possible, we should try to make sure that
// the same list of organizations returns the same hash (regardless of the order).
// The reason we don't use just the organizations that the user provided is because
// that could potentially be a very long list, or otherwise contain characters
// that are not allowed in URLs.