我使用adler32校驗和算法從數據庫ID生成一個數字。所以,當我將一行插入到數據庫中時,我採用該行的標識並使用它來創建校驗和。我遇到的問題是我僅在207次插入數據庫後生成了重複校驗和。這比我預期的要快得多。這裏是我的代碼:Adler32快速重複
String dbIdStr = Long.toString(dbId);
byte[] bytes = dbIdStr.getBytes();
Checksum checksum = new Adler32();
checksum.update(bytes, 0, bytes.length);
result = checksum.getValue();
我在做什麼/我怎麼做有什麼問題?我應該使用不同的方法來創建獨特的字符串嗎?我這樣做是因爲我不想在一個url中使用數據庫ID ......改變數據庫的結構將打破世界上所有的鏈接。
謝謝!
您的代碼目前看起來是正確的。也許你的「結果」是一個「字節」而不是「長」?或者「dbId」並不像你想象的那麼獨特... 其實,我根本不理解你的問題。您需要一個唯一的ID來標識數據庫。並且你的每個數據庫已經*有一個名爲「dbId」的唯一標識符,但是你不想使用它,因爲「???」。所以相反,你需要*非常相同的dbId *並將其轉換爲字符串,並使用Adler32對其進行哈希處理,然後使用* that *作爲「唯一」ID。但是這個散列仍然基於你不想使用的dbId! – Quuxplusone 2012-07-22 04:49:10
比方說,我給你一個鏈接到我的系統中的帖子:example.com/posts/1。然後讓我們說我需要重新組合我的數據庫中的東西(或者完全轉移到另一種類型的存儲),這會導致數據庫標識更改。現在你有一個斷開的鏈接。這就是我產生這些哈希的原因。此外,我剛剛檢查了一些在線哈希工具,似乎在我的系統(126和207)上發生碰撞的兩個id確實爲這些工具產生了相同的adler32結果。例如:http://www.fileformat.info/tool/hash.htm – threejeez 2012-07-22 05:00:05
只是爲了增加我的推理,似乎許多熱門網站都做同樣的事情。例如:http://pinterest.com/pin/186758715768172705/。我懷疑他們的網站有超過186個quadrillion的帖子! – threejeez 2012-07-22 05:03:24