首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP短散列,类似于URL缩短网站

PHP短散列,类似于URL缩短网站
EN

Stack Overflow用户
提问于 2009-06-06 15:41:46
回答 5查看 99.9K关注 0票数 85

我正在寻找一个PHP函数,它可以从字符串或文件中创建一个简短的散列,类似于像tinyurl.com这样的网址缩短网站

哈希长度不应超过8个字符。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-06 15:44:54

网址缩短服务更倾向于使用自动递增的整数值(如补充数据库ID),并使用Base64或其他编码对其进行编码,以获得每个字符的更多信息(64位,而不仅仅是10位之类的数字)。

票数 48
EN

Stack Overflow用户

发布于 2009-06-06 19:35:45

TinyURL不散列任何东西,它使用基数36个整数(甚至基数62,使用小写和大写字母)来指示要访问的记录。

基数36到整数:

代码语言:javascript
复制
intval($str, 36);

整数到基数36:

代码语言:javascript
复制
base_convert($val, 10, 36);

因此,它变成了/url/ax,而不是重定向到像/url/1234这样的路由。这给了你比hash更多的用处,因为不会有冲突。这样你就可以很容易地检查url是否存在,并在用户不知道它已经在数据库中的情况下返回基数为36的正确的、现有的ID。

不要散列,使用其他库来处理这类事情。(它速度更快,并且可以防碰撞。)

票数 168
EN

Stack Overflow用户

发布于 2014-08-05 03:30:57

最好的答案:Smallest Unique "Hash Like" String Given Unique Database ID - PHP Solution, No Third Party Libraries Required.

代码如下:

代码语言:javascript
复制
<?php
/*
THE FOLLOWING CODE WILL PRINT:
A database_id value of 200 maps to 5K
A database_id value of 1 maps to 1
A database_id value of 1987645 maps to 16LOD
*/
$database_id = 200;
$base36value = dec2string($database_id, 36);
echo "A database_id value of $database_id maps to $base36value\n";
$database_id = 1;
$base36value = dec2string($database_id, 36);
echo "A database_id value of $database_id maps to $base36value\n";
$database_id = 1987645;
$base36value = dec2string($database_id, 36);
echo "A database_id value of $database_id maps to $base36value\n";

// HERE'S THE FUNCTION THAT DOES THE HEAVY LIFTING...
function dec2string ($decimal, $base)
// convert a decimal number into a string using $base
{
    //DebugBreak();
   global $error;
   $string = null;

   $base = (int)$base;
   if ($base < 2 | $base > 36 | $base == 10) {
      echo 'BASE must be in the range 2-9 or 11-36';
      exit;
   } // if

   // maximum character string is 36 characters
   $charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

   // strip off excess characters (anything beyond $base)
   $charset = substr($charset, 0, $base);

   if (!ereg('(^[0-9]{1,50}$)', trim($decimal))) {
      $error['dec_input'] = 'Value must be a positive integer with < 50 digits';
      return false;
   } // if

   do {
      // get remainder after dividing by BASE
      $remainder = bcmod($decimal, $base);

      $char      = substr($charset, $remainder, 1);   // get CHAR from array
      $string    = "$char$string";                    // prepend to output

      //$decimal   = ($decimal - $remainder) / $base;
      $decimal   = bcdiv(bcsub($decimal, $remainder), $base);

   } while ($decimal > 0);

   return $string;

}

?>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/959957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档