• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

微博短链接算法php版本实现代码_php实例

php 搞代码 3年前 (2022-01-26) 19次浏览 已收录 0个评论

思路:
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
下面是PHP代码:

 <BR>function shorturl($url='', $prefix='', $suffix='') { <BR>$base = array ( <BR>'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', <BR>'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', <BR>'q', 'r', 's', 't', 'u', 'v', 'w', 'x', <BR>'y', 'z', '0', '1', '2', '3', '4', '5'); <BR>$hex = md5($prefix.$url.$suffix); <BR>$hexLen = strlen($hex); <BR>$subHexLen = $hexLen / 8; <BR>$output = array(); <BR>for ($i = 0; $i < $subHexLen; $i++) { <BR>$subHex = substr ($hex, $i * 8, 8); <BR>$int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); <BR>$out = ''; <BR>for ($j = 0; $j < 6; $j++) { <BR>$val = 0x0000001F & $int; <BR>$out .= $base[$val]; <BR>$int = $int >> 5; <BR>} <BR>$output[] = $out; <BR>} <BR>return $output; <BR>} <BR>$urls = shorturl('http://www.gaodaima.com/'); <BR>var_dump($urls); <BR>


结果

 <BR>array(4) { <BR>[0]=> <BR>string(6) "alms1l" <BR>[1]=> <BR>string(6) "2ipmby" <BR>[2]=> <BR>string(6) "avo1hu" <BR>[3]=> <BR>string(6) "fdlban" <BR>} <BR>


另外一个版本:

 <BR>function shorturl($url='', $prefix='', $suffix='') { <BR>$base = array( <BR>"a","b","c<b>%本文@来源gao@!dai!ma.com搞$$代^@码!网</b><strong>搞代gaodaima码</strong>","d","e","f","g","h", <BR>"i","j","k","l","m","n","o","p", <BR>"q","r","s","t","u","v","w","x", <BR>"y","z","0","1","2","3","4","5", <BR>"6","7","8","9","A","B","C","D", <BR>"E","F","G","H","I","J","K","L", <BR>"M","N","O","P","Q","R","S","T", <BR>"U","V","W","X","Y","Z"); <BR>$hex = md5($prefix.$url.$suffix); <BR>$hexLen = strlen($hex); <BR>$subHexLen = $hexLen / 8; <BR>$output = array(); <BR>for ($i = 0; $i < $subHexLen; $i++) { <BR>$subHex = substr ($hex, $i * 8, 8); <BR>$int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); <BR>$out = ''; <BR>for ($j = 0; $j < 6; $j++) { <BR>$val = 0x0000003D & $int; <BR>$out .= $base[$val]; <BR>$int = $int >> 5; <BR>} <BR>$output[] = $out; <BR>} <BR>return $output; <BR>} <BR>


结果:

 <BR>array(4) { <BR>[0] => <BR>string(6) "6jmMVj" <BR>[1] => <BR>string(6) "2EnIby" <BR>[2] => <BR>string(6) "6vIVfu" <BR>[3] => <BR>string(6) "B7Fb6n" <BR>} <BR>


但是升级版本碰撞率反而更高了,不知道为什么。
测试碰撞的测试代码:

 <BR>$result = array(); <BR>$repeats= array(); <BR>$loop = 20000; <BR>for($i=0;$i<$loop;$i++){ <BR>$url = 'http://www.gaodaima.com/?id='.$i; <BR>$shorta = shorturl($url); <BR>$short = $shorta[0]; <BR>if(in_array($short, $result)){ <BR>$repeats[] = $short; <BR>} <BR>$result[] = $short; <BR>} <BR>$result = array(); <BR>for($i=0;$i<$loop;$i++){ <BR>$url = 'http://www.gaodaima.com/?id='.$i; <BR>$shorta = shorturl($url); <BR>$short = $shorta[0]; <BR>if(in_array($short, $repeats)){ <BR>$result[$short][] = $url; <BR>} <BR>} <BR>var_dump($repeats); <BR>var_dump($result); <BR>


结果:

 <BR>array(8) { <BR>[0] => <BR>string(6) "3eQBzq" <BR>[1] => <BR>string(6) "uQFnay" <BR>[2] => <BR>string(6) "qEZbIv" <BR>[3] => <BR>string(6) "fMneYf" <BR>[4] => <BR>string(6) "FJj6Fr" <BR>[5] => <BR>string(6) "3Eviym" <BR>[6] => <BR>string(6) "j2mmuy" <BR>[7] => <BR>string(6) "jyQfIv" <BR>} <BR>array(8) { <BR>'jyQfIv' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=1640" <BR>[1] => <BR>string(27) "http://www.gaodaima.com/?id=18661" <BR>} <BR>'fMneYf' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=2072" <BR>[1] => <BR>string(26) "http://www.gaodaima.com/?id=8480" <BR>} <BR>'3eQBzq' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=4145" <BR>[1] => <BR>string(26) "http://www.gaodaima.com/?id=4273" <BR>} <BR>'j2mmuy' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=7131" <BR>[1] => <BR>string(27) "http://www.gaodaima.com/?id=17898" <BR>} <BR>'qEZbIv' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=7320" <BR>[1] => <BR>string(26) "http://www.gaodaima.com/?id=8134" <BR>} <BR>'uQFnay' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=7347" <BR>[1] => <BR>string(26) "http://www.gaodaima.com/?id=7962" <BR>} <BR>'FJj6Fr' => <BR>array(2) { <BR>[0] => <BR>string(26) "http://www.gaodaima.com/?id=8628" <BR>[1] => <BR>string(26) "http://www.gaodaima.com/?id=9031" <BR>} <BR>'3Eviym' => <BR>array(2) { <BR>[0] => <BR>string(27) "http://www.gaodaima.com/?id=11175" <BR>[1] => <BR>string(27) "http://www.gaodaima.com/?id=14437" <BR>} <BR>} <BR>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:微博短链接算法php版本实现代码_php实例
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址