ডেভিড রিচারির উত্তরটি প্রসারিত করতে, " হ্যাশ ফাংশন " শব্দটি কিছুটা বেশি বোঝা হয়ে গেছে। প্রায়শই, যখন আমরা একটি হ্যাশ ফাংশন সম্পর্কে কথা বলি তখন আমরা এমডি 5, এসএএএ -1, বা জাভা .hashCode()
পদ্ধতির মতো এমন কিছু বিষয় চিন্তা করি যা কিছু ইনপুটকে একক সংখ্যায় রূপান্তর করে। তবে এই সংখ্যা ডোমেইন খুব অসম্ভাব্য hashtable আপনি ডেটা সংরক্ষণ করার চেষ্টা করছেন হিসাবে একই আকার হতে (অর্থাত সর্বোচ্চ মান) (MD5, 16 বাইট রয়েছে SHA-1 20 বাইট, এবং। .hashCode()
একটি হল int
- 4 বাইটস)।
সুতরাং আপনার প্রশ্নটি পরবর্তী পদক্ষেপ সম্পর্কে - একবার আমাদের একটি হ্যাশ ফাংশন রয়েছে যা সংখ্যায় স্বেচ্ছাসেবীর ইনপুটগুলি ম্যাপ করতে পারে, আমরা কীভাবে এগুলিকে একটি নির্দিষ্ট আকারের ডেটা কাঠামোতে রাখব? অন্য একটি ফাংশন সহ, এটি "হ্যাশ ফাংশন" নামেও পরিচিত!
এই জাতীয় ফাংশনের একটি তুচ্ছ উদাহরণ হ'ল মডুলো ; আপনি সহজেই মডুলোর সাথে একটি অ্যারেতে একটি নির্দিষ্ট সূচকে বেশ কয়েকটি সালিশ আকারের ম্যাপ করতে পারেন map এটি সিএলআরএস-এ "বিভাগ পদ্ধতি" হিসাবে পরিচিত:
টমিটমি
জ ( কে ) = কেমি
...
মিমিমি = 2পিএইচ ( কে )পিট
Al আলগোরিদিমগুলির পরিচিতি, .311.3.1 - সিএলআরএস
মি
জাভা HashMap
বিভাগ বিভাগের একটি সংশোধিত সংস্করণ ব্যবহার করে যা দুর্বল .hashCode()
বাস্তবায়নের জন্য অ্যাকাউন্টে প্রাক-প্রসেসিং পদক্ষেপ করে যাতে এটি দুটি-আকারের পাওয়ারের অ্যারে ব্যবহার করতে পারে। .getEntry()
পদ্ধতিতে ঠিক কী ঘটছে তা আপনি দেখতে পাবেন (মন্তব্যগুলি আমার):
// hash() transforms key.hashCode() to protect against bad hash functions
int hash = (key == null) ? 0 : hash(key.hashCode());
// indexOf() converts the resulting hash to a value between 0 and table.length-1
for (Entry<K,V> e = table[indexFor(hash, table.length)];
...
জাভা 8 একটি পুনর্লিখনের সাথে নিয়ে এসেছিল HashMap
যার আরও দ্রুত, তবে পড়তে একটু শক্ত। এটি সূচক দেখার জন্য একই সাধারণ নীতিটি ব্যবহার করে।