java - Adler32 快速重复

标签 java encryption cryptography checksum adler32

我正在使用 adler32 校验和算法从数据库 ID 生成一个数字。因此,当我向数据库中插入一行时,我获取该行的标识并使用它来创建校验和。我遇到的问题是我只在向数据库插入 207 次后生成了一个重复校验和。这比我预期的要快得多。这是我的代码:

String dbIdStr = Long.toString(dbId);
byte[] bytes = dbIdStr.getBytes();
Checksum checksum = new Adler32();
checksum.update(bytes, 0, bytes.length);
result = checksum.getValue();

我在做什么/怎么做有问题吗?我应该使用不同的方法来创建唯一的字符串吗?我这样做是因为我不想在 url 中使用 db id...更改 db 的结构将破坏世界上所有的链接。

谢谢!

最佳答案

您不应该使用 Adler-32 作为哈希代码生成器。这不是它的目的。您应该使用具有良好哈希属性的算法,除其他外,它可以最大限度地减少冲突的可能性。

您可以简单地使用 Java 的 hashCode方法(在任何对象上)。对于 String 对象,哈希码是字符串的字节值乘以 31 的连续幂的总和。很短的字符串可能会发生冲突,但这不是一个可怕的算法。作为哈希算法,它肯定比 Adler-32 好很多。

使用加密安全散列函数(如 SHA-256)的建议对于您的应用程序来说肯定是过大的,无论是在执行时间还是散列代码大小方面。您应该尝试 Java 的 hashCode 并查看您得到了多少次冲突。如果它看起来比您预期的 2-n 概率要频繁得多(其中 n 是哈希码中的位数), 然后你可以用更好的覆盖它。你可以找到一个链接 here for decent Java hash functions .

关于java - Adler32 快速重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11597762/

相关文章:

c++ - AES 解密大于可用 RAM 的文件

java - 如果相同的盐用于唯一的输入,哈希算法是否能保证唯一的输出?

c++ - 如何在CTR模式下寻找并解密部分码流?

java - 将 AndroidKeyStoreRSAPrivateKey 转换为 RSAPrivateKey 时崩溃

javascript - 不同位置的相同文件是否会有不同的 sha1 哈希值?

java - 尝试解密 RSA 时出错

java - 我正在使用 Spring-Boot,使用类名字符串动态初始化类并获取返回值

java - 使用带有 for 循环整数的堆栈 - 需要使用任意值

java - Scala:检查列表是否为空

java - jframe 内的 Graphstream 小