فلفل نبین چه ریزه ...

امروز سر کلاس راجع به متد hashCode جاوا و کاربردش در ساخت HashMap و HashSet صحبت می‌کردم. از سختی تولید یه هَش قدرتمند هم بحث پیش اومد و گفتم اگه بتونید برای SHA1 برخورد پیدا کنید جایزه دارید! از نقش ریاضیات دوست‌داشتنی در طراحی یه روش هَش خوب که بگذریم، پارادوکس جالبی وجود داره که چطور ممکنه همه چی رو فقط در چند ده بایت خلاصه کرد و برخورد هم پیش نیاد یا تا به حال پیدا نشده؟ خب اگه بخوایم قدرت محاسبات و ذخیره‌سازی رو بدون محدودیت‌های انسانی و فیزیکی حال حاضر تصور کنیم، قطعا نمی‌شه کل اطلاعات رو در چند ده بایت خلاصه کرد. اما همین چند ده بایت چقدر قدرت دارن؟

یه متد هَش ایده‌آل در نظر بگیریم که هَش ۳۲ بایتی تولید می‌کنه. چون این متد الگوریتم ایده‌آلی داره، پس برای ۲ به توان ۲۵۶ اطلاعات مختلف هَش منحصربفرد تولید می‌کنه. اگر کل جمعیت دنیا ده میلیارد نفر باشه و هر کدوم در روز صد اطلاعات کاملا جدید و منحصر بفرد در کل دنیا (اعم از پسورد یا متن گفتگو یا نوشته با هر طولی) تولید کنن، هر روز هزار میلیارد (۱۰ به توان ۱۲) هَش جدید تولید می‌کنیم. اما این متد هَش در حالت ایده‌آل قابلیت تولید ۲ به توان ۲۵۶ یا به عبارتی حدود ۱۰ به توان ۷۶ هَش برای اطلاعات مختلف رو داره. به عبارتی جمعیت دنیا باید بیشتر از ۱۰ به توان ۶۰ سال تلاش کنن تا برای این میزان هَش داده‌ی متناظر پیدا شه و بعد از اون، اولین اطلاعات منحصربفرد اولین برخورد خواهد بود!

اگه معتقدید هر نفر هر روز بیشتر از اینها می‌تونه رشته‌های کاملا منحصربفرد در کل دنیا تولید کنه (مثلا هزار یا ده هزار تا)، صرفا چند صفر از تعداد سال‌های شصت رقمی کم می‌شه و چندان مهم نیست! اگرم فکر می‌کنید کامپیوترهای امروزی قدرت تولید خیلی بیشتر از این‌ها رو دارن، خودتون حساب کتاب کنید و اگه زمان قابل قبولی هم داشت، به اینم فکر کنید که اینهمه هَش رو چطور می‌شه برای استفاده‌های بعدی ذخیره کرد؟ و در نهایت اگه فکر می‌کنید برخورد ممکنه خیلی زودتر از این حرف‌ها و به صورت آزمون و خطا و تصادفی پیدا شه، آمار و احتمالات ریاضیات دوست‌داشتنی در این مورد هم توضیح داره.

البته همه‌ی اینها با فرض الگوریتم هَش ایده‌آل بود و اهمیت اینطور الگوریتمی رو نشون می‌ده. :)