gpt4 book ai didi

java - 散列后的字符串在输出到文件然后输入后不再相同

转载 作者:行者123 更新时间:2023-12-01 16:40:07 25 4
gpt4 key购买 nike

这是一件奇怪的事情,已经花了我一整天的时间:

如果将一个简单的字符串(如“1”)写入文件并立即读取它,则获取的字符串等于原始字符串。

但是如果字符串是由某个哈希函数生成的,则获取的字符串不再相同

下面的代码打印true false,我想知道幕后的技巧。

非常感谢。

public static void main(String[] args) {
try {
String s1 = "1";
File f1 = new File("f1");
write (s1, f1);
System.out.println(read(f1).equals(s1));

MessageDigest md = MessageDigest.getInstance("SHA-512");
String s2 = foo(new File("1.jpg"), md);
File f2 = new File("f2");
write (s2, f2);
System.out.println(read(f2).equals(s2));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

// Hash <i>f</i> by <i>md</i>
static String foo (File f, MessageDigest md) throws IOException {
FileInputStream fis = new FileInputStream(f);
DigestInputStream dis = new DigestInputStream(fis, md);
byte[] b = new byte[1024];
while (dis.read(b, 0, 1024) != -1) {
}
md = dis.getMessageDigest();
String s = new String(md.digest());
dis.close();
fis.close();
return s;
}

static void write (String s, File f) throws IOException {
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(s);
bw.newLine();
bw.close();
fw.close();
}

static String read (File f) throws IOException {
FileReader fr = new FileReader(f);
BufferedReader bf = new BufferedReader(fr);
String s;
s = bf.readLine();
bf.close();
fr.close();
return s;
}

最佳答案

这是您的第一个问题:

String s = new String(md.digest());

您正在使用平台默认编码的任意二进制数据创建一个字符串。它很可能不是平台默认编码中的有效文本数据。换句话说,您正在丢失数据。使用 base-64 对其进行编码 - 这样您将始终拥有一个包含 ASCII 字符的字符串,并且可以可靠地返回原始二进制数据。

您的第二个常见问题是使用 FileReaderFileWriter。这些总是使用默认的平台编码,这是一个可怕的API决策,因为在我看来这使得它们几乎毫无用处。您几乎应该始终指定编码 - 我倾向于使用 UTF-8。使用 FileInputStream/FileOutputStreamInputStreamReader/InputStreamWriter 来读取/写入文件中的文本。 (或使用 Guava 辅助例程。)

关于java - 散列后的字符串在输出到文件然后输入后不再相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4659266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com