[請益] 仿 JAVA hashCode 的作法

看板PHP作者 (黃金俠)時間16年前 (2009/03/03 11:51), 編輯推噓4(4014)
留言18則, 5人參與, 最新討論串1/1
因為要方便資料庫紀錄 tag相關的資訊 目前小弟是採用 crc32(md5($string)) 的作法 將每個tag產生對應的id存起來 但其實不是很確定這樣做造成ID碰撞的機會大不大 不知道有沒有處理過類似問題的大大能夠提供其他更好的作法 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.16.124

03/03 12:40, , 1F
怎麼定義機率大不大?我記得md5的碰撞機率是 1/百萬
03/03 12:40, 1F

03/03 12:40, , 2F
如果不放心的話,這樣寫法,碰撞機率會更小吧:
03/03 12:40, 2F

03/03 12:41, , 3F
ID = md5(md5(原文)的前四碼 + ID);
03/03 12:41, 3F

03/03 20:16, , 4F
md5後 加上timestamp 就不會發生碰撞了吧
03/03 20:16, 4F

03/05 22:56, , 5F
有碰撞機率的東西..後面加什麼東西都還是有機會..
03/05 22:56, 5F

03/05 22:56, , 6F
要把variable-length的東西變fixed-length就是這樣囉
03/05 22:56, 6F

03/06 03:57, , 7F
加timestamp是ok的啊 timestamp不是fixed length XD
03/06 03:57, 7F

03/06 06:00, , 8F
加上timestamp的話,不就每次hashCode結果都不同嗎- -
03/06 06:00, 8F

03/06 06:48, , 9F
看用途啦 只是用來產生id的話就沒關係啊
03/06 06:48, 9F

03/06 06:49, , 10F
如果是checksum 或是存密碼那當然不行啊
03/06 06:49, 10F

03/06 06:49, , 11F
不過後面兩個用途本來就是接受collision的存在的
03/06 06:49, 11F

03/06 06:50, , 12F
如果你的id是要用來作index的話另當別論
03/06 06:50, 12F

03/06 06:51, , 13F
不過要作hash就得接受collision 不然就直接拿tag
03/06 06:51, 13F

03/06 06:52, , 14F
作就好啦 n個bit就是只能表示2^n種值 no magic
03/06 06:52, 14F

03/06 06:53, , 15F
或是你存一份tag=>int的表 再拿int去作index
03/06 06:53, 15F

03/06 06:54, , 16F
也比hash快 流水號的話 不要讓這流水號出現在
03/06 06:54, 16F

03/06 06:54, , 17F
client side, 不然有心人士可以用這個來看你網站的規
03/06 06:54, 17F

03/06 06:55, , 18F
模 所以傳遞參數還是用原本的tag
03/06 06:55, 18F
文章代碼(AID): #19hAb7-0 (PHP)
文章代碼(AID): #19hAb7-0 (PHP)