aalmair
دوشنبه 22 خرداد 1396, 12:20 عصر
سایت های کوتاه کننده ابتدا لینک مورد نظر را در بانک اطلاعاتی ثبت می کنند و برای هر لینک یه id منحصر به فرد وجود دارد
به طور مثال وقتی لینکی را ثبت می کنیم عدد 10024445646 آی دی لینک مورد نظر است
اما با توجه به اینکه هر چه تعداد لینک ها بیشتر باشه عدد مورد نظر نیز بزرگتر خواهد بود (برخی از سایت ها از این روش استفاده می کنند)
راه حل : اگر در مورد مبناهای اعداد اطلاعاتی داشته باشید می دانید که وقتی یک عدد دهدهی را به هگزادسیمال تبدیل می کنیم طول رشته کمتر می شود مثال : هگزادسیمال عدد بالا 25580E6CE
اما هدف ما تبدیل دهدهی به هگزادسیمال نیست
تبدیل دهدهی به مبنای بزرگتر 62
class number_shorter
{
private $table='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP QRSTUVWXYZ0123456789';
function __construct()
{
}
function id2str($int_str=""){
$table=$this->table;
$size_int=strlen($int_str) ;
$t=0;
while($t<$size_int&&$int_str[$t]==" ")
{
$t++;
}
$size_int-=$t;
$int_str=substr($int_str,$t);
if(!is_numeric($int_str))
{
return 0;
}else{
for($j=0;$j<$size_int;$j++)
{
if($int_str[$j]==".")
{
return 0;
}
}
}
$size_table=strlen($table);
$rev=array();
$res="";
while($int_str>=1)
{
$rev []= bcmod($int_str,$size_table);
$int_str = bcdiv ($int_str,$size_table);
}
for($i=count($rev)-1;$i>=0;$i--)
{
$res.=$table[$rev[$i]];
}
return($res);
}
function str2id($str=""){
$table=$this->table;
$size_str=strlen($str);
$size_table=strlen($table);
$rev=array();
$res="0";
for($j=0;$j<$size_str;$j++)
{
$is_exist=0;
for($i=0;$i<$size_table;$i++)
{
if($str[$j]==$table[$i])
{
$is_exist = 1;
$res = bcmul($size_table,$res)+$i;
break;
}
}
if(!$is_exist)
{
return 0;
}
}
return ($res);
}
}
$number_shorter = new number_shorter();
var_dump($number_shorter->id2str(10024445646 )); // output k6zIpm
خروجی عدد بالا 11 رقمی k6zIpm
به طور مثال وقتی لینکی را ثبت می کنیم عدد 10024445646 آی دی لینک مورد نظر است
اما با توجه به اینکه هر چه تعداد لینک ها بیشتر باشه عدد مورد نظر نیز بزرگتر خواهد بود (برخی از سایت ها از این روش استفاده می کنند)
راه حل : اگر در مورد مبناهای اعداد اطلاعاتی داشته باشید می دانید که وقتی یک عدد دهدهی را به هگزادسیمال تبدیل می کنیم طول رشته کمتر می شود مثال : هگزادسیمال عدد بالا 25580E6CE
اما هدف ما تبدیل دهدهی به هگزادسیمال نیست
تبدیل دهدهی به مبنای بزرگتر 62
class number_shorter
{
private $table='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP QRSTUVWXYZ0123456789';
function __construct()
{
}
function id2str($int_str=""){
$table=$this->table;
$size_int=strlen($int_str) ;
$t=0;
while($t<$size_int&&$int_str[$t]==" ")
{
$t++;
}
$size_int-=$t;
$int_str=substr($int_str,$t);
if(!is_numeric($int_str))
{
return 0;
}else{
for($j=0;$j<$size_int;$j++)
{
if($int_str[$j]==".")
{
return 0;
}
}
}
$size_table=strlen($table);
$rev=array();
$res="";
while($int_str>=1)
{
$rev []= bcmod($int_str,$size_table);
$int_str = bcdiv ($int_str,$size_table);
}
for($i=count($rev)-1;$i>=0;$i--)
{
$res.=$table[$rev[$i]];
}
return($res);
}
function str2id($str=""){
$table=$this->table;
$size_str=strlen($str);
$size_table=strlen($table);
$rev=array();
$res="0";
for($j=0;$j<$size_str;$j++)
{
$is_exist=0;
for($i=0;$i<$size_table;$i++)
{
if($str[$j]==$table[$i])
{
$is_exist = 1;
$res = bcmul($size_table,$res)+$i;
break;
}
}
if(!$is_exist)
{
return 0;
}
}
return ($res);
}
}
$number_shorter = new number_shorter();
var_dump($number_shorter->id2str(10024445646 )); // output k6zIpm
خروجی عدد بالا 11 رقمی k6zIpm