Задний план
У меня есть несколько файлов, для которых я запускаю хэши, и мне нужно знать, существуют ли эти файлы уже или нет. Я сохраняю хэши (как дайджест байта Byte[]) и путь к файлу (как путь) в хеш-таблице, чтобы сделать это быстро и чтобы я мог напечатать правильное сообщение о дубликатах.
Проблема
Проблема, с которой я сталкиваюсь, заключается в том, что реализация 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;
}