2015-12-31 44 views
1

我發現有關製作TinyURL(https://stackoverflow.com/a/960364/1778465)這樣的短代碼的問題,而且我不確定自己所做的工作是否正常。使用intval和base_convert創建短鏈接

我有以下的測試代碼:

<?php 
$val = intval('murwaresuperchainreaction', 36); 
echo $val."\n"; 
echo base_convert($val, 10, 36) . "\n"; 
echo "---\n"; 
$val = intval('murwarebarnstormers', 36); 
echo $val."\n"; 
echo base_convert($val, 10, 36) . "\n"; 
echo "---\n"; 
$val = intval('murwarenightmare', 36); 
echo $val."\n"; 
echo base_convert($val, 10, 36) . "\n"; 

和我得到這些結果:

9223372036854775807 
1y2p0ij32e8e7 
--- 
9223372036854775807 
1y2p0ij32e8e7 
--- 
9223372036854775807 
1y2p0ij32e8e7 

我的問題,就是爲什麼所有的結果一樣嗎?根據我掛上面我應該得到「衝突證明」結果答案,但他們都是一樣的...

回答

0

爲每intvalDocumentation

最大值取決於系統。 32個系統具有-2147483648到2147483647因此,例如,這樣的系統上的最大符號的整數範圍,INTVAL(「萬億」)將返回2147483647 64個系統的最大符號整數值是9223372036854775807

當您用較短的字符串嘗試此方法時,您將得到無碰撞結果。但大字符串將返回最大值。因此,此方法不適合從大字符串創建短代碼。

0

您鏈接的答案中編碼的值是一個整數 - 引用該縮短鏈接記錄的ID。通過基本64或Base 36編碼ID,該字符串是變短了很多:

echo base_convert(1234567, 10, 36); 
// output qglj 

intval然後可以用於縮短的字符串轉換回ID:

echo intval('qglj', 36); 
// output 1234567