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

Java 不同的文本但相同的CRC校验和?,java,crc32,Java,Crc32,我的应用程序使用CRC32检查两个内容或两个文件是否相同。 但当我尝试使用它来生成唯一id时,我发现了问题,使用两个不同的字符串,CRC32可以是相同的。这是我的Java代码。提前谢谢 public static String getCRC32(String content) { byte[] bytes = content.getBytes(); Checksum checksum = new CRC32(); checksum.update(bytes, 0, byt

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

使用相同的CRC32查找两个不同的文件/字符串/数据是正常的。只有32位。使用MD5/SHA1-512可以更好地防止复制。

是的,CRC就是这样。它们不是唯一的ID。对于不同的输入,它们可能是不同的,但不一定非要如此。毕竟,您提供的输入超过32位,所以您不能期望有超过232个不同的输入来产生不同的CRC

较长的加密散列(例如SHA-256)更有可能为不同的输入提供不同的输出,但这仍然不是不可能的(而且不可能,因为输入数据与输出数据的数量不同)。CRC和加密散列之间的最大区别在于,如果您愿意,CRC相对容易“引导”-找到冲突并不十分困难,它用于防止意外数据损坏。加密散列旨在防止攻击者故意破坏数据,因此很难故意创建针对特定散列的值


另一方面,在不指定字符集的情况下使用
String.getBytes()
是有问题的——它使用平台默认编码,因此如果在两台机器上使用相同的输入运行相同的代码,则可能会得到不同的结果。我强烈建议您使用固定编码(例如UTF-8)。

是的,它们可以是相同的,但这将以非常低的概率2-32意外发生


正如Jon所指出的,您可以故意使用相同的CRC构造字符串。使之自动化。下面是另一个字符串的示例,其CRC与问题中显示的相同,但与第一个字符串的差异有限:
b5a7b702ab643f7ac47fb57c4fb28b82
,使用欺骗生成。

哈希代码或CRC校验和不是唯一的ID。他们不可能被看到。