• URL短网址生成算法原理和php实现案例


    短网址(Short URL),顾名思义就是在形式上比较短的网址。


    短链接的好处:
    1、内容需要;2、用户友好;3、便于管理
    为什么要这样做的,原因我想有这样几点:
    微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了。
    短网址可以在我们项目里可以很好的对开放级URL进行管理。有一部分网址可以会涵盖暴力,广告等信息,这样我们可以通过用户的举报,完全管理这个连接将不出现在我们的应用中,应为同样的URL通过加密算法之后,得到的地址是一样的。
    我们可以对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于我们对项目的后续工作更好的作出决策。


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


    整理一下进制的转换
    二进制转换十进制:
    10101转换成十进制如下:
    从右边数分别标注为0,1,2,3,4即:2^0*1 + 2^1*0 + 2^2*1 + 2^3*0 + 2^4*1 = 1 + 0 + 4 + 0 + 16 = 21;

    十进制转换成二进制:
    21转换成二进制如下:
    21对2取余分别是10余1, 5余0, 2余1, 1余0即:最后一个余数是1不能再除2 因此:10101

    十六进制:
    它由0-9,A-F组成,字母不区分大小写,A-F对应10-15;
    一般为了区分十六进制我们习惯在前面加个‘0x’例如十六进制 32和0x32 其实是一样的

    十六进制转换成十进制:
    0x32转换成十进制如下:
    从右边数分别标注为0,1 即:16^0*2 + 16^1*3 = 2 + 48 = 50;

    十进制转换成十六进制:
    50转换成十六进制如下:
    50对16取余是3余2 最后一个余数是3不能再除16 因此:32 习惯变成0x32

    位运算:
    程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算说穿了,就是直接对整数在内存中的二进制位进行操作。
    举个例子,6的二进制是110,11的二进制是1011,那么6 and (&)11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
    6可以看成是0110 11是1011 位运算得到的就是10 即:2

    位运算中还有个 >> 移位(从右边移位) 例如:6 >> 1 & 11
    6可以看成是0110 >> 移1位 变成0011 然后再& 11(1011)就得到11 即:3

    备注: x & y 将得到的数是0 ~ x的值

    php版的短链接生成方法

    <?php 
    function shorturl($input) { 
    $base32 = array ( 
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 
    'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
    'y', 'z', '0', '1', '2', '3', '4', '5' 
    ); 
    
    $hex = md5($input); 
    $hexLen = strlen($hex); 
    $subHexLen = $hexLen / 8; 
    $output = array(); 
    
    for ($i = 0; $i < $subHexLen; $i++) { 
    //把加密字符按照8位一组16进制与0x3FFFFFFF(30位1)进行位与运算
    $subHex = substr ($hex, $i * 8, 8); 
    $int = 0x3FFFFFFF & (1 * ('0x'.$subHex)); 
    $out = ''; 
    
    for ($j = 0; $j < 6; $j++) {
    
    //把得到的值与0x0000001F进行位与运算,取得字符数组chars索引 
    $val = 0x0000001F & $int; 
    $out .= $base32[$val]; 
    $int = $int >> 5; 
    } 
    
    $output[] = $out; 
    } 
    
    return $output; 
    } 
    ?>

    用户访问短网址 时的过程:
    1、浏览器访问短网址http://short.cn/Xvdf23,经过DNS解析会指向到http://short.cn的服务器。
    2、服务器根据短网址中的ID字段查找数据库,返回原始网址。
    3、重定向到上面返回的原始网址

  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/lovekingly/p/5505308.html
Copyright © 2020-2023  润新知