4

我正在使用 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 结构的更改将破坏世界上所有的链接。

谢谢!

4

2 回答 2

13

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

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

就执行时间和哈希码大小而言,使用加密安全哈希函数(如 SHA-256)的建议对于您的应用程序来说肯定是多余的。你应该试试 Java 的 hashCode 看看你得到了多少冲突。如果2 -n概率(其中n是哈希码中的位数)看起来比您预期的要频繁得多,那么您可以用更好的概率覆盖它。你可以在这里找到一个不错的 Java 散列函数的链接。

于 2012-07-22T06:54:35.347 回答
0

尝试使用像 SHA-256 这样的安全散列函数。如果您发现任何二进制不相等的数据发生冲突,您将在您的银行帐户中获得 1000 美元,并附上赞美。如果/当 SHA-2 被破解并且您故意进入冲突时,优惠结束。也就是说,输出是 32 字节而不是 32 位。

于 2012-07-22T15:13:13.193 回答