不同的文本但CRC校验和相同?

Vie*_*iet 3 java crc32

我的应用程序使用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).


Mar*_*ler 5

是的,它们可以相同,但是偶然发生的可能性很小,为2 -32

如Jon所述,您可以故意使用相同的CRC构造字符串。 我的欺骗代码可以自动执行。这是另一个字符串的示例,该字符串具有与问题中显示的CRC相同的CRC,但与第一个字符串的区别有限:b5a7b702ab643f7ac47fb57c4fb28b82使用欺骗生成。