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是哈希码中的位数)更频繁,那么你可以用更好的一个覆盖它。 您可以在此处找到适合Java散列函数的链接。

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

Interesting Posts