2 回答

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
一般情況而言需要做字符串到十進(jìn)制數(shù)字的轉(zhuǎn)換可以用 crc32() 函數(shù) ...
這個(gè)函數(shù)的優(yōu)點(diǎn)是快 ... 在我的知識(shí)范圍內(nèi)這應(yīng)該是 php 內(nèi)置最快的哈希函數(shù) ...
缺點(diǎn)是操作系統(tǒng)依賴 ... 不同操作系統(tǒng)的 crc32()
函數(shù)會(huì)產(chǎn)生不一樣的值 ...
至于把 md5()
的結(jié)果轉(zhuǎn)化成十進(jìn)制 ... 用 hexdec() 顯然是不靠譜的 ... 原因如樓上所說不贅述 ...
這里我們用到另外一個(gè)更加靈活的進(jìn)制轉(zhuǎn)換函數(shù) base_convert() ...
這個(gè)函數(shù)的好處是返回 string ... 也就不存在溢出的問題了 ...
示例代碼如下 ...
<?phpecho base_convert( md5( 'something' ), 16, 10 );// 89699910832403552662426604448206446062

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
你可以用php的hexdec函數(shù),把md5的結(jié)果分段轉(zhuǎn),因?yàn)閔exdec最大只能轉(zhuǎn)0x7fffffff,再大就變成float了。
另外,你不一定非要用md5,因?yàn)閙d5的結(jié)果是128bit的,php語言本身無法直接保存這么大的十進(jìn)制數(shù)??梢詤⒖約dbmhash、jshash、或者C++ STL里對(duì)字符串的哈希自己實(shí)現(xiàn)一個(gè),例如這個(gè)是python版的sdbmhash
def sdbm_hash_string(str): h = 0 m = (1 << 32) for i in str: t = h h = (t << 6) % m + (t << 16) % m - t + ord(i) h %= m return h
最后順便說一下,不要試圖把md5結(jié)果拆成幾段然后XOR之類的,效果不如直接取最后幾個(gè)字節(jié)。
- 2 回答
- 0 關(guān)注
- 471 瀏覽
添加回答
舉報(bào)