تابع hash و الگوریتم های درهم سازی در PHP

حتما برای شما نیز پیش آمده که برای پیدا کردن معنی یک کلمه انگلیسی در دیکشنری جستجو کنید. دیکشنری یک لیست بسیار طولانی و مرتب از زوج “کلمه-ترجمه” است؛ اما ما برای پیدا کردن کلمه مورد نظر خود، از ابتدای این لیست شروع به جستجو نمیکنیم.برای اینکه سریعتر جواب مورد نظر خود را پیدا کنیم،  معمولا کلماتی که با حرف یکسان شروع می شوند در کنار هم یک بخش را تشکیل می دهند. “آدرس صفحه شروع” این بخش در فهرست دیکشنری قرار می گیرد و ما برای پیدا کردن کلماتی که با این حرف شروع می شوند، کافیست تنها این بخش را جستجو کنیم. در واقع  ما برای شروع جستجو ابتدا به فهرست مراجعه کرده و حرف اول کلمه مورد نظر خود را با حرف آغازین هر یک از این بخش ها مقایسه می کنیم. زمانی که اولین “مطابقت” را مشاهده کردیم، به بخش مربوطه “پرش” می کنیم و در آن بخش به دنبال کلمه مورد نظر می گردیم. روش درهم سازی اطلاعات نیز تقلیدی از همین روش ساده است تا بتوانیم به راحتی و در کمترین زمان ممکن عملیات جستجو، ویرایش و درج را در لیست های مرتب انجام دهیم.

توابع Hash برای درهم سازی اطلاعات استفاده می شوند. این توابع بصورت یکطرفه(one-way) اطلاعات را رمزگذاری می کنند. به این معنا که اطلاعات کد شده به هیچ وجه قابل بازگشت به حالت اولیه نیستند و در عین حال، کد شده ی هر رشته ای(ورودی) با احتمال بسیار بالایی منحصر به فرد است. مثلا در یکی از روش های ساده Hash که الگوریتم MD5 نام دارد، برخورد در هر ۲۶۲۱۴۴ بار، یکبار رخ می دهد. در واقع در این الگوریتم تعداد ۲۶۲۱۴۴ کد متمایز داریم و چنانچه بخواهیم رشته هایی بیش از این تعداد را کد کنیم، حداقل دو رشته کد تولیدی یکسان خواهند داشت. کامپیوتر های امروزی در کمتر از یک ثانیه می توانند این دو رشته را پیدا کنند. البته الگوریتم های پیچیده تری هم وجود دارند که احتمال برخورد در آنها خیلی کمتر باشد و برای پیدا کردن دو رشته با کد یکسان نیاز به ماه ها یا سال ها زمان باشد.

کاربرد Hash:

درهم سازی ابتدا با این ایده به وجود آمد که “چگونه می توان روشی برای درج و ویرایش و حذف اطلاعات در لیست ها به وجود آورد که بیشترین سرعت ممکن را داشته باشد؟” برای درک بهتر این هدف، ابتدا فرض کنید که لیستی مرتب شده از دانشجویان کلاس داریم که بر اساس حروف الفبایی مرتب شده است. اگر دانشجوی جدیدی بخواهد در این لیست افزوده شود، باید از ابتدای لیست شروع به جستجو کنیم و زمانی که به مکان مناسب برای درج اسم دانشجوی جدید رسیدیم، اسم او را وارد لیست کنیم و بقیه ی دانشجویان لیست را هر کدام یک خانه جا به جا کنیم تا دوباره لیست مرتبی از دانشجویان داشته باشیم. برای حذف و ویرایش نیز مشکلات دیگری خواهیم داشت. درهم سازی این امکان را به ما می دهد تا بدون درگیر شدن در این مسائل، اطلاعات را بصورت سریع درج، ویرایش، حذف و جستجو کنیم. اما کاربرد توابع درهم ساز به همین مورد ختم نشد. مهمترین کاربردهای Hash عبارتند از:

۱٫ حفاظت از کلمه های عبور کاربران و مدیران: امروزه طراحان سیستم های مدیریت محتوا و وب سایت ها برای ذخیره کلمه عبور کاربران و مدیران خود، از توابع درهم سازی استفاده می کنند. با اینکار اگر هکرها بتوانند به داده های موجود در بانک اطلاعاتی وب سایت دسترسی پیدا کنند، نمی توانند بطور مستقیم به کلمه عبور کاربران یا مدیران دسترسی داشته باشند و از حساب کاربری آنها سوء استفاده کنند.

۲٫ بررسی معتبر بوده اطلاعات انتقال داده شده: فرض کنید می خواهیم اطلاعات را از کامپیوتری به کامپیوتر دیگر انتقال دهیم؛ می توانیم همراه با اطلاعات، مقدار Hash مربوط به داده ها را نیز منتقل کنیم. در کامپیوتر مقصد، پیام دریافتی را ابتدا به کمک Hash به کد تبدیل می کنیم و با مقدار Hash دریافتی مقایسه می کنیم. اگر این دو مقدار برابر باشند، اطلاعات صحیح دریافت شده اند. در غیر اینصورت اطلاعات در میان راه دستکاری شده اند یا در انتقال اطلاعات خطایی رخ داده است.

الگوریتم های Hash:

الگوریتم های درهم سازی متداول عبارتند از md5، sha1، sha128، sha256، sha512 و… برای مشاهده لیست الگوریتم های درهم سازی موجود می توانید از تابع hash_algos استفاده کنید:


<?php

print_r(hash_algos());

?>

نحوه درهم سازی اطلاعات:

برای درهم سازی اطلاعات می توانید از تابع hash کمک بگیرید. فرمت این دستور به شکل زیر است:


string hash ( string $algo , string $data [, bool $raw_output = false ] )

همانطور که از قالب تابع بالا پیداست خروجی آن رشته ایست که معادل hash شده اطلاعات($data) است. متغیر $algo نوع الگوریتم درهم سازی را مشخص می کند و متغیر اختیاری $row در صورتی که False باشد، کاراکترهای خروجی lowercase و از اعداد و حروف مبنای ۱۶ خواهد بود( Hexadecimal) و در صورتی که True باشد، خروجی داده های باینری خام خواهند بود. به مثال زیر توجه کنید:


<?php

echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.');

?>

خروجی کد بالا برابر مقدار زیر خواهد بود:


ec457d0a974c48d5685a7efa03d137dc8bbde7e3

توجه داشته باشید، همانطور که در ابتدای پست نیز اشاره شد، توابع درهم سازی یکطرفه بوده و امکان رمزگشایی اطلاعات کد شده در آنها وجود ندارد.
موفق و پیروز باشید

حتما برای شما نیز پیش آمده که برای پیدا کردن معنی یک کلمه انگلیسی در دیکشنری جستجو کنید. دیکشنری یک لیست بسیار طولانی و مرتب از زوج “کلمه-ترجمه” است؛ اما ما برای پیدا کردن کلمه مورد نظر خود، از ابتدای این لیست شروع به جستجو نمیکنیم.برای اینکه سریعتر جواب مورد نظر خود را پیدا کنیم،  …

بررسی کلی

امتیاز کاربر: 4.49 ( 5 رای)
0

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*

theme