docs: private String computeClassHash(Iterable<AutoValueProcessor.Property> props, String pkg) {
      CRC32 crc = new CRC32();
      String encodedType = TypeEncoder.encode(type.asType()) + ":";
      String decodedType = TypeEncoder.decode(encodedType, processingEnv, "", null);
      if (!decodedType.startsWith(pkg)) {
        // This is for compatibility with the way an earlier version did things. Preserving hash
        // codes probably isn't vital, since client and server should be in sync.
        decodedType = pkg + "." + decodedType;
      }
      crc.update(decodedType.getBytes(UTF_8));
      for (AutoValueProcessor.Property prop : props) {
        String encodedProp = prop + ":" + TypeEncoder.encode(prop.getTypeMirror()) + ";";
        String decodedProp = TypeEncoder.decode(encodedProp, processingEnv, pkg, null);
        crc.update(decodedProp.getBytes(UTF_8));
      }
      return String.format("%08x", crc.getValue());
    }