我使用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中使用数据库id。。。数据库结构的改变将打破世界上所有的联系。
谢谢!
您应该而不是使用Adler-32作为哈希代码生成器。这不是它的目的。您应该使用一种具有良好哈希特性的算法,该算法可以最大限度地降低冲突的概率。
您可以简单地使用Java的hashCode方法(在任何对象上)。对于String对象,散列码是字符串的字节值乘以31的连续幂的总和。很短的字符串可能会发生冲突,但这不是一个可怕的算法。作为一种散列算法,它肯定比Adler-32要好得多。
使用加密安全哈希函数(如SHA-256)的建议对您的应用程序来说无疑是言过其实,无论是在执行时间还是哈希代码大小方面。您应该试试Java的hashCode,看看会发生多少冲突。如果它似乎比2-n概率(其中n是哈希码中的位数)的预期频率高得多,那么您可以用更好的概率覆盖它。您可以在这里找到一个不错的Java散列函数的链接。
尝试使用像SHA-256这样的安全散列函数。如果你发现任何不等于二进制的数据发生冲突,你的银行账户上会有1000美元的奖金。如果/当SHA-2被破解,并且您故意进入冲突,则优惠结束。也就是说,输出是32字节而不是32位。