static ContentHashBuilder create() {
      try {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        return wrap(new ContentHashBuilder() {
          @Override
          public void update(Object data) {
            digest.update(String.valueOf(data).getBytes(StandardCharsets.UTF_8));
          }

          @Override
          public Object getResult() {
            byte[] digestBytes = digest.digest();
            long[] hash = new long[digestBytes.length / 8];
            for (int hi = 0; hi < hash.length; hi++) {
              for (int i = 0; i < 8; i++) {
                hash[hi] = (hash[hi] << 8) | (digestBytes[hi * 8 + i] & 0xFF);
              }
            }
            return hash;
          }
        });
      }
      catch (NoSuchAlgorithmException e) {
        LOG.info(e);
      }
      // fallback logic
      return wrap(new ContentHashBuilder() {
        int hash = 0;
        @Override
        public void update(Object data) {
          hash = 31 * hash + (data == null? "null" : data).hashCode();
        }

        @Override
        public Object getResult() {
          return hash;
        }
      });
    }
static ContentHashBuilder create()