Adler32非常快速地重复

thr*_*eez 4 java encryption checksum cryptography 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();
Run Code Online (Sandbox Code Playgroud)

我在做什么/怎么做有什么问题吗?我应该使用不同的方法来创建唯一的字符串吗?我这样做是因为我不想在url中使用db id ...对db结构的更改将破坏世界上所有的链接.

谢谢!

Mar*_*ler 12

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

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

在执行时间和哈希码大小方面,使用加密安全散列函数(如SHA-256)的建议对于您的应用程序来说肯定是过度的.您应该尝试Java的hashCode,看看你得到了多少次碰撞.如果它似乎比你期望的2 -n概率(其中n是哈希码中的位数)更频繁,那么你可以用更好的一个覆盖它.您可以在此处找到适合Java散列函数的链接.

  • @Miles:这不仅仅是一个提示,他似乎是发明校验和的*Adler. (3认同)
  • CRC也未作为散列算法进行优化.它有一些很好的属性,但有更好的选择. (2认同)
  • 可以使用基数85中的10个字符来表示64位数. (2认同)