比较字符串中的散列与本地文件的散列

时间:2011-06-01 06:43:08

标签: java md5

我要做的是从文本文件中读取,其中每行都有文件的路径,然后是分隔符的空间和随附的散列。所以我调用checkVersion()和loadStrings(File f_)返回一个String [],每行一个地方。当我试图检查哈希时,我最终得到的东西甚至不是十六进制的,它的长度应该是它应该是的两倍,这可能是我的眼睛只是俯视的明显的东西。这背后的想法是为我的游戏自动更新以节省带宽,感谢您的时间。

代码已修复,如果有其他人有此问题,这里是最终版本,非常感谢大家。

void checkVersion() {
  String[] v = loadStrings("version.txt");
  for(int i=0; i<v.length; i++) {
    String[] piece = split(v[i], " ");  //BREAKS INTO FILENAME, HASH
    println("Checking "+piece[0]+"..."+piece[1]);

    if(checkHash(piece[0], piece[1])) {
      println("ok!");
    } else {
      println("NOT OKAY!");
      //CONTINUE TO DOWNLOAD FILE AND THEN CALL CHECKVERSION AGAIN
    }
  }
}

boolean checkHash(String path_, String hash_) {
  return createHash(path_).equals(hash_);
}

byte[] messageDigest(String message, String algorithm) {
  try {
  java.security.MessageDigest md = java.security.MessageDigest.getInstance(algorithm);
  md.update(message.getBytes());
  return md.digest();
  } catch(java.security.NoSuchAlgorithmException e) {
    println(e.getMessage());
    return null;
  }
} 

String createHash(String path_) {
  byte[] md5hash = messageDigest(new String(loadBytes(path_)),"MD5");
  BigInteger bigInt = new BigInteger(1, md5hash);
  return bigInt.toString(16);
}

2 个答案:

答案 0 :(得分:1)

String.getBytes()方法返回表示字符串字符编码的字节。它不会将其解析为表示某个任意基数中的数字的字节。例如,"AA".getBytes()会在Windows上产生0x41 0x41,而不是10101010b,这是你期望的那样?为此,您可以,例如Byte.parseByte("AA", 16)

您用于创建哈希的库可能有一种方法可以收回自己的字符串表示。如何转换回来取决于你没有给我们的表示。

答案 1 :(得分:1)

使用以下代码将哈希字节转换为字符串

//byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String output = bigInt.toString(16);
System.out.println("MD5: " + output);

for more information