تابع هش یا hash function چیست؟

احتمالا تابحال کلمه تابع hash رو شنیدید و شاید خیلی هاتون استفاده کردید ولی من اینجا میخوام یه توضیح کوچیک ساده در مورد توابع هش بنویسم ... در مطالب بعدی بطور مبسوطی در مورد کاربرد هش صحبت خواهد شد. :)

Hash Functions

سلام
امروز میخوام یکم در مورد تابع هش به معنای کلیش بنویسم.
این مطلب پیش زمینه یه مطلب دیگه است که برای اون مینویسمش. 🙂

خب خب

هش (hash) یا به اصطلاح درهم ریزی در اصل یک تابع است که با یک سری عملیات یک طرفه پشت سر هم، ورودی را به یک سری بیت خروجی نامفهوم تبدیل میکند.

نامفهوم نه به اون معنا ها ..😜

تابع هش یا همون Hash Function یه تابع با 4 تا ویژگی است که در ادامه بیان میکنم.

برگشت ناپذیری

یعنی تابع ما مثل چرخ گوشته و اگه گوشت رو بریزی توی اون از اون طرف گوشت چرخ شده میده بهت و دیگه نمیتونی گوشت قبلی که یه تیکه بود رو بدست بیاری حتی اگه از اینور چرخ گوشت دوباره به زور فشار بدی بره تو 🙂

اینم یه سایت آنلاین برای اینکه SHA-256 یه چیزی رو حساب کنی:


مثلا در مورد الگوریتم SHA-256 در بالا شما هر سری بیت ورودی که به این تابع بدی این تابع به شما یه خروجی با اندازه ثابت 256 بیت میده (32 بایت) و این بیت ها رو وقتی میخوای با هگز نشون بدی (یعنی هر 4 بیت رو با یه کاراکتر 0 تا 9 یا A B C D E F نشون میدن) میشه 64 کارکتر که توی خروجی مینویسه.

قابل بازتولید بودن

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

مثلا در SHA-256 در لینک قبلی:
ورودی اگر Ali باشه باید خروجی به صورت زیر باشه. (شما هم بزنید باید این بیاد و گرنه یه جای کار میلنگه 🙂 )

862ef3927a7c8acfd3e79aa547800ef285cd9b13a39f5ec2d47554981cb313c8

عدم برخورد (Collision) یا تصادم / تکراری نبودن

یعنی وقتی یه ورودی میدیم مثلا Ali و خروجی بالا رو داریم دیگه نباید به ازای ورودی دیگه ای خروجی بالا تولید بشه. یعنی ما وقتی ورودی های مختلفی میدیم باید خروجی هم متفاوت باشه.

البته عقل سلیم میگه که مثلا برای SHA-256 چون خروجی 256 بیته ما اگه همه حالات یک ورودی 257 بیتی رو چک کنیم حتما 2 تا خروجی یکی میشن که خب بله ولی عمر و قدرت اینو نداریم اینهمه حالات رو چک کنیم فعلا (البته فک کنم این الگوریتمه رو میشه یکیاریش کرد ولی الگوریتم های دیگه هستن که دیگه خیلی سختن) 😅
در ضمن احتمال اینکه شما دو سری بیت بدید به تابع و یکی بشن خروجی هاشون خیلی خیلی کمه.

گرچه دیدیم که گوگل برای الگوریتم MD5 دوتا فایل pdf داد که هششون یکی بود.😝

پس بگیم به طور مؤثری تصادم نداشته باشه کافیه.

غیر قابل پیش بینی بودن

یعنی اینکه ما نتونیم مثلا به تابع ورودی 1 بدیم بعدش 2 بدیم و بعدش 3 بدیم و اینجور سعی در دراوردن خروجی برای 4 باشیم. یا کارای مشابه این چنین که از ورودی هایی که با هم ارتباط منطقی دارن بخواییم خروجی رو برای بعدی پیش بینی کنیم.

اگر یک بیت تغییر پیدا کنه توی ورودی بطور متوسط 50 درصد بیت های خروجی تغییر پیدا میکنن.

اگه سرچ کنید ممکنه یه سری ویژگی دیگه ببینید که خب در نهایت یکی هستن مثلا خطی نبودن یا Bit dependency یا Avalanching یا هر چیز دیگه در اصل همین حرف ها رو میزنن.

امروزه نمیشه بدون hash ها زندگی کرد و ما هر روزه صد ها بار این توابع رو مستقیم و غیرمستقیم تو دنیای مجازی به کار میگیریم.

راستی میتونید یه هش فانکشن خیلی ساده برای اعداد صحیح بگید؟ (یه عمگر یک طرفه ؟) زیاد پیچیده فکر نکنید و نیاز نیست همه ویژگی ها بالا رو داشته باشه.

اینجا کلیک کن تا یکی از جواب ها رو ببینی

منابع:

https://blog.angular-university.io/
https://crypto.stackexchange.com/
https://www.quora.com/

دیدگاه ها

دیدگاهی نوشته نشده است.

به عنوان اولین نفر دیدگاه خودتان را در مورد این پست بنویسید.