【发布时间】:2012-07-20 19:36:34
【问题描述】:
我正在使用 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 结构的更改将破坏世界上所有的链接。
谢谢!
【问题讨论】:
-
到目前为止,您的代码看起来是正确的。也许您的“结果”是“字节”而不是“长”?或者“dbId”并不像你想象的那么独特......实际上,我根本不明白你的问题。您需要一个唯一的 ID 来标识数据库。而且您的每个数据库已经具有一个名为“dbId”的唯一标识符,但您不想使用它,因为“???”。因此,您取而代之的是,您使用 非常相同的 dbId,并将其转换为字符串,并使用 Adler32 对其进行哈希处理,然后使用 that 作为您的“唯一”ID。但是该哈希仍然基于您不想使用的 dbId!
-
假设我给你一个指向我系统中帖子的链接:example.com/posts/1。然后假设我需要重新组织数据库中的内容(或者可能完全转移到不同类型的存储),这会导致数据库 ID 发生变化。现在你有一个断开的链接。这就是我生成这些哈希的原因。另外,我刚刚检查了一些在线哈希工具,似乎在我的系统上发生冲突的两个 id(126 和 207)确实为这些工具产生了相同的 adler32 结果。例如:fileformat.info/tool/hash.htm
-
只是为了增加我的推理,似乎许多流行的网站都在做同样的事情。例如:pinterest.com/pin/186758715768172705。我怀疑他们的网站上有超过 186 万亿个帖子!
-
如果 dbId 发生变化,那么其哈希(或校验和)也将发生变化。散列 dbId 不会给您带来任何好处。
-
如果您重新编号,您可以只存储旧 ID。
标签: java encryption cryptography checksum adler32