我有一些我正在运行哈希的文件,我需要知道这些文件是否已经存在。我将哈希值(作为字节摘要字节[])和文件路径(作为路径)存储在哈希表中以使其快速,因此我可以打印关于重复项的正确消息。
我遇到的问题是看起来Hashtable或byte []背后的实现导致地址或者toString()值被用作键。我可以将字节摘要转换为人类可读的字符串,但由于需要检查很多小文件,我担心这会产生开销。
我在使用地址超过值的哈希表的假设中是否正确,如果是,我如何确保使用该值?
static Hashtable<byte[], Path> htable = new Hashtable<byte[], Path>();
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
String file = "Z:\\file.txt";
String file2 = "Z:\\file2.txt";
// First file
Path filePath = Paths.get(file);
doHashStore(filePath);
// Second file
filePath = Paths.get(file2);
doHashStore(filePath);
// First again, should notify already exists
filePath = Paths.get(file);
doHashStore(filePath);
}
// Add to table
private static void doHashStore(Path p) throws NoSuchAlgorithmException, IOException{
byte[] md5 = doMD5(p);
if(htable.containsKey(md5)) {
System.out.println(p.toString()+" already in table! "+toHexadecimal(md5));
} else {
htable.put(md5, p);
System.out.println(p.toString()+" added to table "+toHexadecimal(md5));
}
}
// Perform the md5 hash
private static byte[] doMD5(Path filePath) throws IOException, NoSuchAlgorithmException{
byte[] b = Files.readAllBytes(filePath);
byte[] c = MessageDigest.getInstance("MD5").digest(b);
return c;
}
// Convert the byte[] from digest into a human readable hash string
private static String toHexadecimal(byte[] digest){
String hash = "";
for(byte aux : digest) {
int b = aux & 0xff;
if (Integer.toHexString(b).length() == 1)
hash += "0";
hash += Integer.toHexString(b);
}
return hash;
}