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

标签 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"));       
}

最佳答案

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

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

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

关于java - 不同的文本但相同的 CRC 校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27291131/

相关文章:

java - 如何在 Java 中的 JSON 字符串中在不知道确切键的情况下屏蔽特定值

java - Lambda 表达式创建以整数为键、以列表为值的映射

c# - 与 C# 中的 USB 相比,从映射的网络驱动器读取文件非常慢

hash - CRC-32 哈希的唯一性是否足以唯一标识包含文件名的字符串?

c - ZLIB 似乎在 C 中返回 CRC32B 而不是 CRC32

java - 为什么 junit 说我的 boolean 测试应该无效?

java - 从数组中的三个整数中找到可以得到的最高乘积 - 如何使用蛮力求解

ubuntu - 在 Ubuntu 上修复 "crc32 tool not found"

algorithm - 当我们在CRC32中使用CLMUL时,位反射(reflect)常数是如何计算的?

java - 重构和测试