Discuz!大师网

搜索
查看: 1588|回复: 0

微博短链接算法PHP版本

[复制链接]
发表于 2012-6-10 15:51:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

      

  思路:

  1)将长网址md5生成32位签名串,分为4段, 每段8个字节;

  2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;

  3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;

  4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;

  下面是PHP代码:

  1. function shorturl($url='', $prefix='', $suffix='') {
  2. $base32 = array (
  3. 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  4. 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
  5. 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
  6. 'y', 'z', '0', '1', '2', '3', '4', '5');

  7. $hex = md5($prefix.$url.$suffix);
  8. $hexLen = strlen($hex);
  9. $subHexLen = $hexLen / 8;
  10. $output = array();

  11. for ($i = 0; $i < $subHexLen; $i++) {
  12. $subHex = substr ($hex, $i * 8, 8);
  13. $int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
  14. $out = '';
  15. for ($j = 0; $j < 6; $j++) {
  16. $val = 0x0000001F & $int;
  17. $out .= $base32[$val];
  18. $int = $int >> 5;
  19. }
  20. $output[] = $out;
  21. }
  22. return $output;
  23. }

  24. $urls = shorturl('http://www.php100.com');
  25. var_dump($urls);
复制代码


回复 马甲回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|网站地图|小黑屋|展会网|Discuz站长论坛 |天天打卡

GMT+8, 2024-5-9 13:51 , Processed in 0.023308 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表