code: func CalculateFingerprint(m api.PrefixMetadata) string {
  	m.Fingerprint = ""
  
  	blob, err := proto.Marshal(&m)
  	if err != nil {
  		panic(fmt.Sprintf("failed to proto-marshal PrefixMetadata for prefix %q - %s", m.Prefix, err))
  	}
  
  	h := sha1.New()
  	h.Write([]byte("PrefixMetadata:"))
  	h.Write(blob)
  	return base64.RawURLEncoding.EncodeToString(h.Sum(nil))
  }
docs: // CalculateFingerprint derives a fingerprint string for the given metadata.
  //
  // It is basically base64-encoded SHA1 digest of the serialized proto
  // (excluding 'fingerprint' field itself). It doesn't have to be
  // cryptographically secure.
  //
  // Note that it is also fine if the proto encoding changes with time. We don't
  // care about exact meaning of the fingerprint, as long as it changes each time
  // we update the metadata (so strictly speaking we can just generate random
  // strings and call them fingerprints).