code: func (r *ClientExtractorResult) ObjectRefAliases() []*api.ObjectRef {
  	all := r.ClientBinary.AllHashDigests
  
  	// Older entries do not have AllHashDigests field at all.
  	if len(all) == 0 {
  		ref := &api.ObjectRef{
  			HashAlgo:  api.HashAlgo(api.HashAlgo_value[r.ClientBinary.HashAlgo]),
  			HexDigest: r.ClientBinary.HashDigest,
  		}
  		if common.ValidateObjectRef(ref, common.KnownHash) == nil {
  			return []*api.ObjectRef{ref}
  		}
  		return nil // welp, have 0 supported algos, should not really happen
  	}
  
  	// Order the result by HashAlgo enum values. This loop also naturally skips
  	// algos not understood by the current version of the server, since they are
  	// not in HashAlgo_name map.
  	refs := make([]*api.ObjectRef, 0, len(all))
  	for algo := int32(1); api.HashAlgo_name[algo] != ""; algo++ { // skip UNSPECIFIED
  		if digest := all[api.HashAlgo_name[algo]]; digest != "" {
  			ref := &api.ObjectRef{HashAlgo: api.HashAlgo(algo), HexDigest: digest}
  			if common.ValidateObjectRef(ref, common.KnownHash) == nil {
  				refs = append(refs, ref)
  			}
  		}
  	}
  	return refs
  }
docs: // ObjectRefAliases is list of ObjectRefs calculated using all hash algos known
  // to the server when the client binary was extracted.
  //
  // Additionally all algos not understood by the server right NOW are skipped
  // too. This may arise if the server was rolled back, but some files have
  // already been uploaded with a newer algo.