我正在使用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结构的更改将破坏世界上所有的链接。
谢谢!
答案 0 :(得分:10)
您应该不使用Adler-32作为哈希码生成器。这不是它的用途。您应该使用具有良好散列属性的算法,除其他外,该算法可以最大限度地减少冲突的可能性。
您可以简单地使用Java的hashCode方法(在任何对象上)。对于String对象,哈希码是字符串的字节值乘以31的连续幂的总和。可能存在与非常短的字符串的冲突,但它不是一个可怕的算法。它绝对比Adler-32好多了,作为哈希算法。
使用加密安全散列函数(如SHA-256)的建议对于您的应用程序来说无论在执行时间还是散列码大小方面都是过度的。您应该尝试Java的hashCode,看看你得到了多少次碰撞。如果它似乎比你期望的 2 -n 概率要频繁得多(其中 n 是哈希码中的位数) ),然后你可以用一个更好的覆盖它。您可以找到here for decent Java hash functions链接。
答案 1 :(得分:0)
尝试使用SHA-256等安全散列函数。如果您发现任何非二进制相等的数据发生冲突,您的银行帐户将获得1000美元的赔率。如果/当SHA-2被破解并且您故意输入 时,优惠结束。也就是说,输出是32字节而不是32位。