درک الگوریتم هشینگ به ساده ترین شکل ممکن

اسم الگوریتم هش مثلا چیزی مثل SHA256 حتما به چشم شما آشنا است و آن را بسیار دیدید مثلا زمانی که بخواهید چیزی را از اینترنت دانلود کنید. در پایین لینک دانلود کد بلند و بالایی را می‌بینید که بیشتر اوقات با نام checksum نمایش داده میشود. این کد با یکی از شیوه‌های هش کردن درست میشود. در این مقاله با هم نگاهی خواهیم داشت به مفهوم hash و اهمیت آن در دنیای کامپیوتر

·۵ دقیقه برای خواندن
 درک الگوریتم هشینگ به ساده ترین شکل ممکن

درباره هشینگ

اجازه بدید این موضوع را با یک مثال ساده یاد بگیریم. من کد زیر را به عنوان هشینگ خودم می‌نویسم. یک کد خیلی ساده در زبان پایتون.

def myHashing(n):
    if n % 2 == 0:
        return 1
    return 0

در کد بالا من هر مقدار عددی را به تابع بدم اگر زوج باشد به من ۱ و اگر فرد باشد به من ۰ را میدهد. مثلاً من اگر لیستی مانند [12 ,11 ,13 ,16 ,17] را در تابع وارد کنم چنین جوابی را خواهم گرفت [1 ,0 ,0 ,1 ,0]. اما مهمترین نکته‌ای که در اینجا به نظر مشهود است اینکه شما هر عدد با هر طولی را به تابع hash بدهید خروجی‌ای با طول ثابت را به شما تحویل خواهد داد.

ویژگی‌های تابع hash

به طور کلی دو ویژگی اصلی به عنوان ویژگی‌های پایه برای یک الگوریتم هشینگ مطرح می‌شود.

خروجی با طول ثابت به ازای هر مقدار ورودی

در الگوریتم‌های هشینگ باید امکان ورود مقدار با اندازه دلخواه وجود داشته باشد. به عنوان مثال بتوان یک فایل pdf کامل را به تابع داد از طرفی وظیفه تابع تولید یک خروجی با اندازه مشخص مثلا ۱۲۸ بیت باشد. البته برخی الگوریتم‌ها خروجی‌هایی با طول متغیری هم ایجاد می‌کنند.

تابع هش برگشت ناپذیر است

فرض کنید به شما یک مقدار هش شده مثل این عبارت را بدهند 929f4de02a32a6afe14609554ab6e668e2988138bc736cc4f8fe678c709b9754 مطلقا شما نمیتوانید چیزی که باعث تولید این عبارت شده را کشف کنید. اما چیزی که قطعا به ذهن شما هم رسیده اینکه خب تولید چنین عبارتی با یک تابع رندوم ساده امکان پذیر است. اما اینجا دقیقا یک ویژگی نهفته در تابع هش وجود دارد.

خروجی قابلیت باز تولید دارد.

یعنی اگر شما هر چند بار یک ورودی ثابت را به تابع بدهید دقیقا همان خروجی قبلی را برای شما تولید خواهد کرد. این یعنی تابع هش یک خروجی رندوم را تولید نمیکند. این تابع بر اساس الگوریتم‌های دقیق ریاضی یک خروجی مشخص را برای شما ایجاد خواهد کرد.

این به معنی خروجی تکراری خواهد بود؟

اجازه بدید با هم کد هش قبلی را بررسی کنیم اگر شما عبارت codepedia.top را در یک تابع sha256 وارد کنید این عبارت را به عنوان خروجی دریافت میکنید 929f4de02a32a6afe14609554ab6e668e2988138bc736cc4f8fe678c709b9754 حالا اگر عبارت codepediatop را به همان تابع بدهید این عبارت را دریافت میکنید 72221b44dc69898b665d60a426941c045c8e6f5787ea80bd3e43b334bfc97175 مقایسه دو خروجی به ما نشان می‌دهد که با کمترین تغییر در مقدار ورودی پاسخ تابع هش به طور کلی تغییر خواهد کرد.

نتیجه گیری

هشینگ یکی از متداول ترین الگوریتم‌های رمز نگاری است که برای استفاده‌های مختلفی از مخفی کردن رمز کاربر در دیتابیس گرفته تا بررسی صحت یک فایل دانلودی می‌تواند مورد استفاده قرار بگیرد. برای اطلاعات بیشتر پیشنهاد میکنم این ویدئو در کانال یوتیوب ما را مشاهده کنید.