2012-04-24 73 views
2

我已經閱讀了5-10個關於這個主題的不同文章,並沒有給出明確的例子。他們解釋了背景故事。PHP URL縮寫

  1. 我有從數字「1」記錄的MySQL數據庫爲「500000」
  2. 我想要的網址,可以根據這些記錄的ID號
  3. 我想要的網址呆在之間的恆定3-5數字

實施例:

http://wwwurl.com/1將再次 http://wwwurl.com/5000000http://wwwurl.com/ASd234s 將是http://wwwurl.com/Y2v0R4r

我可以得到一個明確的功能代碼來做這項工作,謝謝。

+1

我假設你不希望這些「網址」是可預測的/連續的。對吧? – Aziz 2012-04-24 09:40:32

+0

另一個問題:是否要將這些映射(數字 - > url)存儲在數據庫中?或者您是否希望使用某個函數從數字計算網址? – Aziz 2012-04-24 09:42:34

+0

第三個問題:你面臨哪些困難?它是那些URL和數字的代?還是使用PHP處理URL請求? – Aziz 2012-04-24 09:43:58

回答

0

爲了減少ID號爲較短的字符串轉換爲基臺35 ....

$short_id=base_convert($id, 10, 35); 

如果你想使之更難以預料的順序是什麼,墊它出來並用已知的字符串異或:

function shortcode($id) 
{ 
    $short_id=str_pad($short_id, 4, '0', STR_PAD_LEFT); 
    $final=''; 
    $key='a59t'; // 500000 = 'bn5p' 
    for ($x=0; $x<strlen($short_id); $x++) { 
    $final=chr('0') | (ord(substr($short_id, $x, 1))^ord(substr($key, $x, 1)); 
    } 
    return $final; 
} 

爲了得到原始的id,只需將該過程逆轉。

0

一個非常愚蠢的例子 - 使用例如substr(md5($id), 10, 15),其中$ id是您的1-500000記錄ID號。在32位哈希代碼內的位置10和15之間生成相同哈希的概率(但您也可以使用位置24-28等)限制爲零...

保存映射也會更好ID < - > HASH到數據庫表,輕鬆找到基於URL的相關記錄。

整個源代碼 - 基於URL的哈希創建,URL重寫,映射保存和記錄檢索是一個非常複雜的問題,可以在數千個變體中實現,主要取決於程序員的技能,經驗以及系統實施這一進...

+1

使用MD5的一個小子字符串(5個字符)會產生太多的衝突。 5個字符的子字符串(十六進制數字)將有大約1M個可能性,並且問題是建議500K記錄(大約一半的可能性)。碰撞將會太多。檢查http:// stackoverflow。com/questions/4681913/substr-md5-collision – Aziz 2012-04-24 10:17:34

+0

當然這可以加強 - 我只給出了一個非常原始的例子。雖然不知道碰撞概率的問題是如此之大,gosh ...還有一些檢查應該在生成哈希值時生成,實際生成的哈希值是唯一的。 – shadyyx 2012-04-24 10:32:20

+0

或者使用一些TEA algorythm可以幫助...像這裏:http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm(和PHP實現:http://www.php-einfach.de/sonstiges_generator_xtea.php)。 – shadyyx 2012-04-24 10:36:33