2012-04-24 77 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