zoukankan      html  css  js  c++  java
  • PHP: Short URL Algorithm Implementation

    1.http://www.snippetit.com/2009/04/php-short-url-algorithm-implementation/

    The following code is written according to the algorithm above excluding the database checking part for duplication:

    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++) {
    $subHex = substr ($hex, $i * 8, 8);
    $int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
    $out = '';
    
    for ($j = 0; $j < 6; $j++) {
    $val = 0x0000001F & $int;
    $out .= $base32[$val];
    $int = $int >> 5;
    }
    
    $output[] = $out;
    }
    
    return $output;
    }
    Sample code to test/use the above function:
    
    $input = 'http://www.snippetit.com/1';
    $output = shorturl($input);
    
    echo "Input : $input
    ";
    echo "Output : {$output[0]}
    ";
    echo " {$output[1]}
    ";
    echo " {$output[2]}
    ";
    echo " {$output[3]}
    ";
    echo "
    ";
    
    $input = 'http://www.snippetit.com/2';
    $output = shorturl($input);
    
    echo "Input : $input
    ";
    echo "Output : {$output[0]}
    ";
    echo " {$output[1]}
    ";
    echo " {$output[2]}
    ";
    echo " {$output[3]}
    ";
    echo "
    ";
    Output:
    
    Input : http://www.snippetit.com/1
    Output : h0xg4r
    bdr3tw
    osk2d3
    4azfqa
    
    Input : http://www.snippetit.com/2
    Output : tm5kxb
    ceoj2s
    yw3dvl
    nrmrxl
    

      

    The function return an array of 4 elements, you can use any one of them. The others can be used as alternative unique code for the input when you found a duplicated code in your database (same code but different input - although it is unlikely to happen but it will happen). Chances to get a duplicated code is about n/(32^6) or n/1,073,741,824 where n is the number of records in your database.

    As you can see, the output results are quite random although you only have one character different in the input string. The output is always consistent, for the same input you will always get the same output.

    To make the output more unpredictable by the others, you can scramble the values in the $base32 array or/and add in your own private key or/and XOR the value of $val with a value from range 0 to 31.

    For example to scramble the values in the $base32 array, you can change the position of the values or/and replace the value with another (make sure the replaced value is URL safe character).

    For example to add in private key, you can add in additional string when calling the md5() function, e.g.:

    $hex = md5('my-secret-key'.$input.'my-another-secret-key');
    For example to XOR the value of $val with value of 18:

    $out .= $base32[$val ^ 18];

  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/Athrun/p/3273637.html
Copyright © 2011-2022 走看看