使用byte []作为键的Hashtable不会检测重复键

时间:2017-01-29 06:17:30

标签: java hashtable md5 digest hash-collision

背景

我有一些我正在运行哈希的文件,我需要知道这些文件是否已经存在。我将哈希值(作为字节摘要字节[])和文件路径(作为路径)存储在哈希表中以使其快速,因此我可以打印关于重复项的正确消息。

问题

我遇到的问题是看起来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;
}

0 个答案:

没有答案