为什么File.hashCode()不同

时间:2014-03-01 17:09:28

标签: android sharedpreferences hashcode

这是我用来从sdcard复制sharedpreference文件的代码。

File fileSrc = new File(filePath, "userdata.xml");
File fileDes = new File("/data/data/com.nik/shared_prefs/", "userdata.xml");
...
...
private void copyFile(File fileSrc, File fileDes) {
FileInputStream fileinputstream=null;
FileOutputStream fileoutputstream=null;
try {
fileinputstream = new FileInputStream(fileSrc);
fileoutputstream = new FileOutputStream(fileDes);
byte[] buffer = new byte[4096];
int count = 0;
while ((count = fileinputstream.read(buffer)) > 0) {
    fileoutputstream.write(buffer, 0, count);
}
fileinputstream.close();
fileoutputstream.flush();
fileoutputstream.close();
}
catch(IOException e) {
    e.printStackTrace();
}
}
if(fileSrc.hashCode() == fileDes.hashCode()){
    Log.d("Copy result: ", "Files Equal!");
} else {
    Log.d("Copy result: ", "Files not Equal!");
}
if(fileSrc == fileDes){
    Log.d("=>Copy result: ", "Files Equal!");
} else {
    Log.d("=>Copy result: ", "Files not Equal!");
}
}

上面的代码成功运行并复制了该文件,但它始终显示“Files not Equal!”在日志。

如果我在资源管理器中打开文件,内容是相同的。那么为什么我会得到“文件不等于!”在这两种情况下......

编辑:

我创建了以下方法来创建文件的SHA-256哈希

private MessageDigest fileHash(File file) {
    MessageDigest md=null;
    try {
    md = MessageDigest.getInstance("SHA-256");
    FileInputStream fileinputstream = new FileInputStream(file);
    byte[] dataBytes = new byte[1024];
    int nread = 0;
    while ((nread = fileinputstream.read(dataBytes)) != -1) {
        md.update(dataBytes, 0, nread);
    }
    }
    catch(IOException e) {
        e.printStackTrace();
    }
    catch(NoSuchAlgorithmException e){
        e.printStackTrace();
    }
    return md;
}

并用

调用它
if(fileHash(fileSrc) == fileHash(fileDes)){
Log.d("=>Copy result: ", "Files Equal!");
} else {
Log.d("=>Copy result: ", "Files not Equal!");
}

我仍然得到“文件不等!”。

1 个答案:

答案 0 :(得分:2)

File.hashCode()返回从文件对象派生的哈希码,即基本上是文件名。它不会在磁盘上散列文件的内容。由于两个文件名不同,因此哈希码很可能也不同。

回答编辑: 您现在比较两个消息摘要对象,而不是文件的哈希值。由于对象不同,因此再次出现不相等。

相反,您应该从函数返回哈希值:

private byte[] fileHash(File file) {
    ...
    return md.digest();
}

并将它们比作:

if (Arrays.equals(fileHash(fileSrc), fileHash(fileDes))) { ... }