Foundationপ্রথম নীতি থেকে
LEVEL 0 · Mathematical Foundations

Hash Function

হ্যাশ ফাংশন

নির্বিচার আকারের input থেকে নির্দিষ্ট আকারের output। Collision গাণিতিকভাবে অনিবার্য; ভালো hash সেগুলো সমানভাবে ছড়ায়।

also: hash

Domain অসীম, codomain সসীম → [[injective]] হওয়া অসম্ভব → collision আছেই। প্রশ্ন শুধু কতটা সমানভাবে ছড়ায়।

Birthday bound: N টা সম্ভাব্য মানে প্রায় 1.177√N টা input-এই ৫০% সম্ভাবনায় collision।

আকার৫০% collision-এ
32 bit~৭৭,০০০
64 bit5×10⁹
256 bit4×10³⁸

তাই cryptographic hash-এর collision resistance তার আকারের অর্ধেক — SHA-256 দেয় ১২৮ bit, ২৫৬ নয়।

ভালো আর খারাপ hash:

def bad(s):  return sum(ord(c) for c in s)      # সব anagram collide
def good(s):
    h = 0
    for c in s: h = (h * 31 + ord(c)) & 0xFFFFFFFF
    return h

31 কেন — মৌলিক, বিজোড়, আর 31*h == (h<<5) - h

Hash flooding: Java-র "Aa".hashCode() == "BB".hashCode()। ইচ্ছাকৃত collision দিয়ে hash table-কে O(n²)-এ নামিয়ে DoS করা যায়। প্রতিকার — hash randomization (প্রতি process-এ random seed), যে কারণে Python-এ string-এর hash() প্রতি run-এ বদলায়।

“ভালো” প্রসঙ্গভেদে বদলায়: hash table চায় সমান বণ্টন, cryptographic hash চায় collision খোঁজা অবাস্তব, perceptual hash চায় একই রকম input একই hash পাক — সেখানে collision কাম্য।