我的应用程序使用CRC32检查两个内容或两个文件是否相同.但是当我尝试使用它来生成唯一的id时,我看到了问题,使用两个不同的字符串,CRC32可以是相同的.这是我的Java代码.提前致谢.
public static String getCRC32(String content) {
byte[] bytes = content.getBytes();
Checksum checksum = new CRC32();
checksum.update(bytes, 0, bytes.length);
return String.valueOf(checksum.getValue());
}
public static void main(String[] args){
System.out.println(getCRC32("b5a7b602ab754d7ab30fb42c4fb28d82"));
System.out.println(getCRC32("d19f2e9e82d14b96be4fa12b8a27ee9f"));
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 11
是的,这就是CRC的样子.它们不是唯一的ID.他们可能是为不同的输入不同,但他们不具备如此.毕竟,您提供的输入超过32位,因此您不能指望有超过2 32个不同的输入来生成不同的CRC.
较长的加密散列(例如SHA-256)更有可能为不同的输入提供不同的输出,但它仍然不是不可能的(并且由于输入数据量与输出数据的不同而不能).CRC和加密哈希之间的最大区别在于,如果您愿意,CRC相对容易"引导" - 找到冲突并不是非常困难,并且它用于防止意外数据损坏.加密哈希旨在防止某些攻击者故意破坏数据 - 因此很难刻意创建针对特定哈希的值.
另外,在String.getBytes()不指定字符集的情况下使用它会产生问题 - 它使用平台默认编码,因此如果在具有相同输入的两台计算机上运行相同的代码,则可以获得不同的结果.我强烈建议您使用固定编码(例如UTF-8).