HashMap
বালতি একটি নির্দিষ্ট সংখ্যা রয়েছে। এটি hashCode
কোন বালতিটি toোকাতে হবে তা নির্ধারণ করতে এটি ব্যবহার করে। সরলতার জন্য এটি একটি মডুলাস হিসাবে কল্পনা করুন।
আমাদের হ্যাশকোডটি যদি 123456 হয় এবং আমাদের 4 টি বালতি থাকে, 123456 % 4 = 0
তাই আইটেমটি প্রথম বালতিতে চলে যায়, বালতি 1।
যদি আমাদের hashCode
ফাংশনটি ভাল হয় তবে এটির একটি সমান বিতরণ করা উচিত যাতে সমস্ত বালতি কিছুটা সমানভাবে ব্যবহৃত হয়। এই ক্ষেত্রে, বালতি মানগুলি সংরক্ষণ করার জন্য একটি লিঙ্কযুক্ত তালিকা ব্যবহার করে।
তবে আপনি ভাল হ্যাশ ফাংশন প্রয়োগ করতে লোকের উপর নির্ভর করতে পারবেন না। লোকেরা প্রায়শই দুর্বল হ্যাশ ফাংশন লিখবে যার ফলস্বরূপ অ-সম-বিতরণ হবে। এটিও সম্ভব যে আমরা কেবল আমাদের ইনপুটগুলি দিয়ে দুর্ভাগ্যজনক হতে পারি।
এই বিতরণ যত কম হবে ততই আমরা ও (1) ক্রিয়াকলাপ থেকে আরও এগিয়ে চলেছি এবং আমরা O (n) ক্রিয়াকলাপের দিকে আরও এগিয়ে চলেছি।
হ্যাশম্যাপের প্রয়োগটি যদি বালতিগুলি বেশি বড় হয়ে যায় তবে লিঙ্কযুক্ত তালিকার চেয়ে কিছু বালতি গাছগুলিতে সংগঠিত করে এটিকে হ্রাস করার চেষ্টা করে। এই কি TREEIFY_THRESHOLD = 8
জন্য হয়। যদি একটি বালতিতে আটটির বেশি আইটেম থাকে তবে এটি একটি গাছে পরিণত হওয়া উচিত।
এই গাছটি একটি লাল-কালো গাছ , সম্ভবত এটি বেছে নেওয়া হয়েছে কারণ এটি কিছু খারাপ-গ্যারান্টি সরবরাহ করে। এটি প্রথম হ্যাশ কোড অনুসারে বাছাই করা হয়। যদি হ্যাশ কোডগুলি একই হয়, তবে বস্তুগুলি সেই ইন্টারফেসটি প্রয়োগ করে কিনা তা compareTo
পদ্ধতি ব্যবহার করে Comparable
, অন্যথায় পরিচয় হ্যাশ কোড।
মানচিত্র থেকে এন্ট্রিগুলি সরিয়ে ফেলা হলে, বালতিতে প্রবেশের সংখ্যাগুলি হ্রাস করতে পারে যে এই গাছের কাঠামোর আর প্রয়োজন নেই। এটা কি UNTREEIFY_THRESHOLD = 6
জন্য হয়। যদি একটি বালতিতে উপাদানের সংখ্যা ছয়টির নিচে নেমে যায়, তবে আমরা সম্ভবত একটি লিঙ্কযুক্ত তালিকা ব্যবহার করতে ফিরে যেতে পারি।
অবশেষে, আছে MIN_TREEIFY_CAPACITY = 64
।
যখন একটি হ্যাশ মানচিত্র আকারে বড় হয়, এটি স্বয়ংক্রিয়ভাবে নিজেকে আরও বালতিযুক্ত আকার দেয়। আমাদের যদি একটি ছোট হ্যাশম্যাপ থাকে তবে আমাদের খুব পূর্ণ বালতি পাওয়ার সম্ভাবনা অনেক বেশি, কারণ আমাদের কাছে জিনিস রাখার মতো বিভিন্ন বালতি নেই। আরও বেশি বালতি যে কম পূর্ণ Hash এই ধ্রুবকটি মূলত আমাদের হাশম্যাপ খুব ছোট হলে গাছগুলিতে বালতি তৈরি শুরু না করার জন্য বলেছে - এর পরিবর্তে প্রথমে আকারটি আরও বড় হওয়া উচিত।
পারফরম্যান্স লাভ সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য, এই আশাটি সবচেয়ে খারাপ অবস্থার উন্নতির জন্য যুক্ত করা হয়েছিল। যদি আপনার hashCode
ফাংশনটি খুব ভাল না হয় তবে আপনি সম্ভবত এই অপটিমাইজেশনগুলির কারণে কেবলমাত্র একটি লক্ষণীয় পারফরম্যান্সের উন্নতি দেখতে পাবেন ।
এটি খারাপ hashCode
বাস্তবায়ন থেকে রক্ষা করার জন্য ডিজাইন করা হয়েছে এবং সংঘর্ষের আক্রমণগুলির বিরুদ্ধে প্রাথমিক সুরক্ষাও সরবরাহ করে , যেখানে কোনও খারাপ অভিনেতা একই বালতিতে থাকা ইনপুটগুলি ইচ্ছাকৃতভাবে নির্বাচন করে কোনও সিস্টেমকে ধীর করার চেষ্টা করতে পারে।
TREEIFY_THRESHOLD
এবং মোট বিনের সংখ্যা কমপক্ষেMIN_TREEIFY_CAPACITY
। আমি আমার উত্তরে এটি কভার করার চেষ্টা করেছি ...