我使用的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();
是不是有什么错什么/如何我在干什么? 我应该使用不同的方法来创造独特的琴弦? 我这样做,因为我不想使用DB ID在网址...更改数据库的结构将打破所有的链接赫然出现在世界各地。
谢谢!
你不应该使用阿德勒32哈希代码生成器。 这不是什么它是。 您应该使用具有良好的散列性能,其中,除其他事项外碰撞的概率最小化的算法。
你可以简单地使用Java的的hashCode方法(在任何对象)。 对于String对象的哈希码是连续的31.权力有可能在很短的字符串的碰撞串倍字节值的总和,但它不是一个可怕的算法。 这绝对不是阿德勒32好多了作为哈希算法。
建议来使用加密的安全散列函数(如SHA-256)是肯定矫枉过正您的应用程序,无论是在执行时间和哈希代码大小方面。 你应该尝试Java的的hashCode,看看你有多少碰撞获得。 如果它似乎更频繁的比你所期望的2 -n概率(其中n是哈希码的位数),那么你可以用一个更好的覆盖。 你可以找到一个链接在这里体面的Java哈希函数 。
尝试使用像SHA-256安全散列函数。 如果你发现了,是不是二进制等于任何数据冲突,你会得到您的银行帐户1000 $,与赞美。 如果/当SHA-2被破解,你故意输入一个碰撞优惠截止。 这就是说,输出为32个字节,而不是32位。