gpt4 book ai didi

java - Adler32 快速重复

转载 作者:搜寻专家 更新时间:2023-11-01 01:22:50 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com