我正在寻找一个PHP函数,它可以从字符串或文件中创建一个简短的散列,类似于像tinyurl.com这样的网址缩短网站
哈希长度不应超过8个字符。
发布于 2009-06-06 15:44:54
网址缩短服务更倾向于使用自动递增的整数值(如补充数据库ID),并使用Base64或其他编码对其进行编码,以获得每个字符的更多信息(64位,而不仅仅是10位之类的数字)。
发布于 2009-06-06 19:35:45
TinyURL不散列任何东西,它使用基数36个整数(甚至基数62,使用小写和大写字母)来指示要访问的记录。
基数36到整数:
intval($str, 36);
整数到基数36:
base_convert($val, 10, 36);
因此,它变成了/url/ax
,而不是重定向到像/url/1234
这样的路由。这给了你比hash更多的用处,因为不会有冲突。这样你就可以很容易地检查url是否存在,并在用户不知道它已经在数据库中的情况下返回基数为36的正确的、现有的ID。
不要散列,使用其他库来处理这类事情。(它速度更快,并且可以防碰撞。)
发布于 2014-08-05 03:30:57
代码如下:
<?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;
}
?>
https://stackoverflow.com/questions/959957
复制相似问题