aalmair
سه شنبه 13 خرداد 1393, 19:03 عصر
امروز می خوام براتون در مورد فشرده سازی و کوتاه سازی آدرس اینترنتی مختصر برای افزایش آگاهی توضیح بدم
فرض کنید در سایتی مثل youtube که نمی دونم چقدر فیلم ارسال میشه اما زیاد ارسال است به جای پیوند رو به رو
www.youtube.com/watch?v=iCUV3iv9xO
از این پیوند استفاده شود :
www.youtube.com/watch?id=121515415451548451584848548748454
و یا زمانی که می خواهید آدرس یک سایت را به طور کامل در سایت های کوچک کننده ی url کوچک کنید
مثال :
http://arashcart.ir (http://aalma.ir)
روش کار
جدول ساده ای به صورت زیر خواهیم داشت
id
value
که id به صورت کلید اصلی و auto increment می باشد
و قرار است که id را فشرده تر کنیم (فشرده سازی عدد تنها)
و در value آدرس پیوند مورد قرار می گیرد و زمانی که درخواستی به id مورد نظر ارسال شد مقدار value متناظر را بیرون می کشیم
البته اگر اطلاعات زیادی نداشته باشید می توانید از خود id بدون فشرده سازی اشتفاده کنید
فشرده سازی عدد
مقدمه :
وقتی ما عددی مثل عدد دسیمال 255 را به هگزادسیمال تبدیل می کنیم می شود FF . یعنی یک عدد 3 کاراکتری به 2 کاراکتری تبدیل شد
پس اگه ما بتوانیم عدد دسیمال مورد نظر را به مبنایی بالاتر مثل مبنای 64 تبدیل کنیم کارمان تمام می شود
مبدل تبدیل مبنای دسیمال به مبنای 64
<?php
class number_to_64{
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);
}
}
$convert_dec_2_64=new number_to_64();
echo $convert_dec_2_64->id2str('447589153');
فرض کنید در سایتی مثل youtube که نمی دونم چقدر فیلم ارسال میشه اما زیاد ارسال است به جای پیوند رو به رو
www.youtube.com/watch?v=iCUV3iv9xO
از این پیوند استفاده شود :
www.youtube.com/watch?id=121515415451548451584848548748454
و یا زمانی که می خواهید آدرس یک سایت را به طور کامل در سایت های کوچک کننده ی url کوچک کنید
مثال :
http://arashcart.ir (http://aalma.ir)
روش کار
جدول ساده ای به صورت زیر خواهیم داشت
id
value
که id به صورت کلید اصلی و auto increment می باشد
و قرار است که id را فشرده تر کنیم (فشرده سازی عدد تنها)
و در value آدرس پیوند مورد قرار می گیرد و زمانی که درخواستی به id مورد نظر ارسال شد مقدار value متناظر را بیرون می کشیم
البته اگر اطلاعات زیادی نداشته باشید می توانید از خود id بدون فشرده سازی اشتفاده کنید
فشرده سازی عدد
مقدمه :
وقتی ما عددی مثل عدد دسیمال 255 را به هگزادسیمال تبدیل می کنیم می شود FF . یعنی یک عدد 3 کاراکتری به 2 کاراکتری تبدیل شد
پس اگه ما بتوانیم عدد دسیمال مورد نظر را به مبنایی بالاتر مثل مبنای 64 تبدیل کنیم کارمان تمام می شود
مبدل تبدیل مبنای دسیمال به مبنای 64
<?php
class number_to_64{
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);
}
}
$convert_dec_2_64=new number_to_64();
echo $convert_dec_2_64->id2str('447589153');