docs: public ClassHash computeHash(JavaClass javaClass) {
          this.className = javaClass.getClassName();
  
          Method[] methodList = new Method[javaClass.getMethods().length];
  
          // Sort methods
          System.arraycopy(javaClass.getMethods(), 0, methodList, 0, javaClass.getMethods().length);
          Arrays.sort(methodList, (o1, o2) -> {
              // sort by name, then signature
              int cmp = o1.getName().compareTo(o2.getName());
              if (cmp != 0) {
                  return cmp;
              }
              return o1.getSignature().compareTo(o2.getSignature());
  
          });
  
          Field[] fieldList = new Field[javaClass.getFields().length];
  
          // Sort fields
          System.arraycopy(javaClass.getFields(), 0, fieldList, 0, javaClass.getFields().length);
          Arrays.sort(fieldList, (o1, o2) -> {
              int cmp = o1.getName().compareTo(o2.getName());
              if (cmp != 0) {
                  return cmp;
              }
              return o1.getSignature().compareTo(o2.getSignature());
          });
  
          MessageDigest digest = Util.getMD5Digest();
  
          // Compute digest of method names and signatures, in order.
          // Also, compute method hashes.
          CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
          for (Method method : methodList) {
              work(digest, method.getName(), encoder);
              work(digest, method.getSignature(), encoder);
  
              MethodHash methodHash = new MethodHash().computeHash(method);
              methodHashMap.put(XFactory.createXMethod(javaClass, method), methodHash);
          }
  
          // Compute digest of field names and signatures.
          for (Field field : fieldList) {
              work(digest, field.getName(), encoder);
              work(digest, field.getSignature(), encoder);
          }
  
          classHash = digest.digest();
  
          return this;
      }