public String hash(Map<String, ?> map) {
   MessageDigest digest = HashUtil.createDigester();
   List<String> keys = getSortedKeys(map);
   for (String key : keys) {
     Object value = getKeyValue(key, map);
     appendObject(digest, key);
     digest.update("=".getBytes());
     appendObject(digest, value);
     digest.update(",".getBytes());
   }
   return HashUtil.toHexString(digest.digest());
 }