PHP - 独特的散列函数,只有4位数(不需要精确)

时间:2011-06-17 17:50:25

标签: php hash url-shortener

我正在构建一个简单的URL缩短脚本,我想将URL散列为唯一ID,但如果我使用像MD5这样的东西,则URL不会很短。

他们的一些散列函数或者无论如何都要创建一个只有4或5位数的唯一ID吗?

6 个答案:

答案 0 :(得分:3)

散列会导致碰撞。只需使用自动增量值。这包括使用字母数字字符来压缩它。这就是大多数URL缩短程序的工作方式。

尼克拉斯在下面的回答非常出色。

答案 1 :(得分:3)

使用自动递增整数并将它们转换为包含所有字母(低位和大写)的标识符以缩短它们:

function ShortURL($integer, $chr='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') {    
// the $chr has all the characters you want to use in the url's;    
    $base = strlen($chr);
// number of characters = base
    $string = '';
    do {
        // start looping through the integer and getting the remainders using the base
        $remainder = $integer % $base;      
        // replace that remainder with the corresponding the $chr using the index
        $string .= $chr[$remainder];
        // reduce the integer with the remainder and divide the sum with the base
        $integer = ($integer - $remainder) / $base;
    } while($integer > 0);

       // continue doing that until integer reaches 0;
    return $string;

}

以及将它们恢复为整数的相应函数:

function LongURL($string, $chr='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') {
       // this is just reversing everything that was done in the other function, one important thing to note is to use the same $chr as you did in the ShortURL
        $array = array_flip(str_split($chr));

        $base = strlen($chr);
        $integer = 0;
        $length = strlen($string);


        for($c = 0; $c < $length; ++$c) {
            $integer += $array[$string[$c]] * pow($base, $length - $c - 1);
        }
        return $integer;


    }

答案 2 :(得分:0)

使用MD5(或等效方法)的优点是可能性的数量如此之大,以至于出于所有实际目的,您可以假设该值是唯一的。为了确保4位随机ID是唯一的,需要数据库来跟踪现有ID。

基本上,您必须重复生成ID并检查数据库。

答案 3 :(得分:0)

你总是可以保留MD5的前5个字符,如果它已经存在,你可以在url-string中添加一个随机值,然后重试,直到得到一个唯一的字符。

答案 4 :(得分:0)

我刚刚复制了代码并运行它,看起来他的字符串函数是向后的。我输入了在shorturl中生成的数字并将其运行回来,并获得了不同的数字。所以我解码了数字,发现字符串必须反馈到上面的当前编码的长网址。

答案 5 :(得分:-1)

这是一个小班,可以满足您的需求 http://blog.kevburnsjr.com/php-unique-hash