PDA

View Full Version : حرفه ای: الگوریتم و نحوه ساخت سرویس کوتاه کننده آدرس



maysam.m
یک شنبه 18 دی 1390, 15:53 عصر
سلام

میخواستم بدونم الگوریتم و نحوه ساخت یک سرویس کوتاه کننده آدرس چطوریه؟
مثلا در سرویس goo.gl آدرس :


http://www.w3schools.com/php/default.asp

به

http://goo.gl/2Xt0
تبدیل میشه

میخوام بدونم کلا نحوه ساخت آدرس چطوریه؟

ممنون میشم دوستان یه توضیحی بدهند :قلب:

maysam.m
دوشنبه 19 دی 1390, 15:49 عصر
کسی چیزی نمیدونه؟

MMSHFE
دوشنبه 19 دی 1390, 16:01 عصر
کار پیچیده ای نیست. شما کافیه یک رشته کوتاه و غیرتکراری (یعنی توی دیتابیس موجود نباشه) تولید کنید (مثل 2Xt0) و بعد، اون رشته رو همراه با لینک اصلی، توی دیتابیس ذخیره کنید. حالا یک فایل htaccess. اینطوری میسازین:


RewriteEngine on
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

و بعد، توی فایل index.php سایتتون کدی شبیه این رو میگذارین:


mysql_connect('localhost', 'db_user', 'db_pass') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
if(isset($_GET['url']) {
$url = mysql_query("SELECT * FROM `urls_table_name` WHERE (`short_url`='{$_GET['url']}') LIMIT 1");
if($url && mysql_num_rows($url) > 0) {
$url = mysql_fetch_assoc($url);
header('Location: '.$url['original_url'];
exit();
}
}

توی کد فوق، فرض بر اینه که شما لینک کوتاه شده (2Xt0) رو توی فیلد short_url و لینک کامل (http://www.w3schools.com/php/default.asp) رو توی فیلد original_url ذخیره کردین.
موفق باشید.

mbf5923
دوشنبه 19 دی 1390, 17:57 عصر
سلام اگه امکانش هست این کد رو ضمیمه کنید من که هرکار کردم جواب نداد که نداد

maysam.m
سه شنبه 20 دی 1390, 21:30 عصر
کار پیچیده ای نیست. شما کافیه یک رشته کوتاه و غیرتکراری (یعنی توی دیتابیس موجود نباشه) تولید کنید (مثل 2Xt0) و بعد، اون رشته رو همراه با لینک اصلی، توی دیتابیس ذخیره کنید. حالا یک فایل htaccess. اینطوری میسازین:


RewriteEngine on
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

و بعد، توی فایل index.php سایتتون کدی شبیه این رو میگذارین:


mysql_connect('localhost', 'db_user', 'db_pass') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
if(isset($_GET['url']) {
$url = mysql_query("SELECT * FROM `urls_table_name` WHERE (`short_url`='{$_GET['url']}') LIMIT 1");
if($url && mysql_num_rows($url) > 0) {
$url = mysql_fetch_assoc($url);
header('Location: '.$url['original_url'];
exit();
}
}

توی کد فوق، فرض بر اینه که شما لینک کوتاه شده (2Xt0) رو توی فیلد short_url و لینک کامل (http://www.w3schools.com/php/default.asp) رو توی فیلد original_url ذخیره کردین.
موفق باشید.

سلام

مسئله ی اصلی همون ساختن اون رشته اس . من با جستجویی که کردم به دو راه رسیدم.
1- ساخت یه رشته ی تصادفی (رندوم)
2- تبدیل به یک رشته ی یکتا شبیه اعداد

1- توی مسئله ی اول من اینطوری فهمیدم که با تابع رندوم یه رشته میسازیم و اون میشه آدرس لینک


function genRandomString() {
$length = 3;
$characters = '0123456789abcdefghijklmnopqrstuvwxyz';
$string = '';
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters))];
}
return $string;
}



2- توی مسئله ی دوم هم یه راه کار اینطوری بود که آدرس رو میگیریم و اون رو با md5 هش میکنیم و سپس رشته ی هش شده رو تقسیم بر 8 میکنیم و یه رشته ی 4 کاراکتری بدست میاریم.


function shorturl($input) {
$base32 = array (
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '0', '1', '2', '3', '4', '5'
);

$hex = md5($input);
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = array();

for ($i = 0; $i < $subHexLen; $i++) {
$subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = '';

for ($j = 0; $j < 6; $j++) {
$val = 0x0000001F & $int;
$out .= $base32[$val];
$int = $int >> 5;
}

$output[] = $out;
}

return $output;
}

1- در روش اول ما یک رشته ی تصادفی میسازیم که شاید برای تعداد لینکهای کم خوب باشد اما به نظرم اگر تعداد رکوردها افزایش پیدا کنه ممکنه رشته های تکراری افزایش پیدا کنه و برنامه مجبور باشه برای ساخت هر لینک تعداد بسیار زیادی کوئری برای امتحان تکراری نبودن در پایگاه داده انجام بده.
2- روش دوم به نظرم بهتره ولی شاید تعدادی کلمه 4 کلمه ی اولشون مشابه باشه و اون وقت برنامه دچار مشکل بشه.و در ضمن اگه چند کاربر لینک های مشابه وارد کردند و خواستند کوتاه کنند تکلیف چی میشه!؟

خودم یه چیز دیگه ای تو ذهنمه که نمیدونم چقدر درست باشه.

من میگم بهتر بود که مثلا آی دی یکتا هر رکورد رو تبدیل به یک رشته میکردیم اینطوری سیستم بهتری میشد.
مثال:


record id
1
2
.
.
2000
.
.
.

encode:
1 -> aaaa
2-> aaab
2000 -> gdrt

decode:
$x = gdrt -> 2000


بعد موقعی که میخواستیم لینک رو بگیریم اون رشته رو تبدیل به آی رکورد مورد نظر میکردیم و به راحتی نتیجه میگرفتیم



"SELECT * FROM `urls_table_name` WHERE`short_url`='$x' LIMIT 1"

خوشحال میشم نظرات شما و دوستان رو بدونم :قلب:

mtchabok
چهارشنبه 21 دی 1390, 11:47 صبح
سلام
روشی که خودت گفتی خیلی ساده و خوب هس و می تونی از این توابع استفاده کنی :
dechex (http://ir2.php.net/manual/en/function.dechex.php)
hexdec (http://ir2.php.net/manual/en/function.hexdec.php)

maysam.m
یک شنبه 25 دی 1390, 11:22 صبح
سلام
روشی که خودت گفتی خیلی ساده و خوب هس و می تونی از این توابع استفاده کنی :
dechex (http://ir2.php.net/manual/en/function.dechex.php)
hexdec (http://ir2.php.net/manual/en/function.hexdec.php)
سلام

این توابع خوب هستند فقط مشکلی که دارند این است که من میخواهم حتما رشته های 4 کاراکتری یا طول دلخواه داشته باشم اما این توابع فقط عدد را تغییر مبنا می دهند.
اگر میشد توابعی شبیه اینها به صورت سفارشی نوشت بسیار عالی بود.

maysam.m
سه شنبه 27 دی 1390, 13:19 عصر
دوستان کسی نظر دیگه ای نداره؟

چطوری میشه یه تابعی شبیه توابع تبدیل مبنا ساخت که هر عدد را تبدیل به یک رشته ی حداقل چهار کاراکتری کرد؟