সাধারণত একটি সরল হ্যাশ ফাংশন ইনপুটটির "উপাদান অংশগুলি" (স্ট্রিংয়ের ক্ষেত্রে অক্ষরগুলি) গ্রহণ করে এবং কিছু ধ্রুবকের শক্তির সাহায্যে তাদেরকে গুণিত করে এবং কিছু সংখ্যার সাথে একত্রে যুক্ত করে কাজ করে। সুতরাং উদাহরণস্বরূপ একটি স্ট্রিংয়ের একটি আদর্শ (যদিও বিশেষ ভাল না) হ্যাশ হতে পারে:
(first char) + k * (second char) + k^2 * (third char) + ...
তারপরে যদি সমস্ত প্রথম চরটি থাকা সমস্ত স্ট্রিং খাওয়ানো হয়, তবে কমপক্ষে পূর্ণসংখ্যার ধরণের ওভারফ্লো না হওয়া পর্যন্ত ফলাফলগুলি সমস্ত একই মডুলো কে হবে।
[উদাহরণস্বরূপ, জাভার স্ট্রিং হ্যাশকোড এর সাথে চূড়ান্তভাবে অনুরূপ - এটি কে = 31 দিয়ে অক্ষরগুলি বিপরীত ক্রম করে। সুতরাং আপনি একই স্ট্রিংগুলির মধ্যে 31 স্ট্রাইকগুলির মধ্যে স্ট্রাইকিং মডিউলগুলি পান এবং স্ট্রাইকিং রিলেশনগুলি 2 ^ 32 এর শেষের ব্যতীত একই স্ট্রিংগুলির মধ্যে মডিউল হয়। এটি হ্যাশটেবল আচরণকে গুরুতরভাবে বিশৃঙ্খলা করে না]]
বালিশের সংখ্যার উপরে হ্যাশটির মডুলাস গ্রহণ করে একটি হ্যাশটেবল কাজ করে।
সংঘর্ষগুলি হ্যাশটেবলের কার্যকারিতা হ্রাস করার কারণে সম্ভাব্য মামলার জন্য সংঘর্ষ উত্পাদন না করার জন্য হ্যাশটেবলে এটি গুরুত্বপূর্ণ।
এখন, ধরুন যে কেউ একটি সম্পূর্ণ গুচ্ছ মানকে একটি হ্যাশটেবলে রাখে যা আইটেমগুলির মধ্যে কিছুটা সম্পর্ক রাখে, যেমন সবার প্রথম চরিত্রের মতো। এটি একটি মোটামুটি অনুমানযোগ্য ব্যবহারের ধরণ, আমি বলব, তাই আমরা এটি খুব বেশি সংঘর্ষের সৃষ্টি করতে চাই না।
দেখা যাচ্ছে যে "গণিতের প্রকৃতির কারণে", যদি হ্যাশে ধ্রুবক ব্যবহৃত হয়, এবং বালতিগুলির সংখ্যা কপিরাইট হয় তবে কয়েকটি সাধারণ ক্ষেত্রে সংঘর্ষগুলি হ্রাস করা হয়। তারা কপিরাইট না হলে, তবে ইনপুটগুলির মধ্যে কিছু মোটামুটি সহজ সম্পর্ক রয়েছে যার জন্য সংঘর্ষগুলি হ্রাস করা হয় না। সমস্ত হ্যাশগুলি সমান মডিউলগুলি সাধারণ ফ্যাক্টর থেকে বেরিয়ে আসে, যার অর্থ তারা সকলেই বালতিগুলির 1 / n ম অংশে পড়বে যার মানটি সাধারণ ফ্যাক্টরটি করে। আপনি অনেকগুলি সংঘর্ষের চেয়ে n গুন পাবেন, যেখানে n সাধারণ কারণ। যেহেতু এন কমপক্ষে 2, তাই আমি বলতে পারি যে এটি মোটামুটি সাধারণ ব্যবহারের ক্ষেত্রে কমপক্ষে দ্বিগুণ সংখ্যক সংঘর্ষের তুলনায় স্বাভাবিক হিসাবে গ্রহণযোগ্য। যদি কিছু ব্যবহারকারী আমাদের বালতিগুলিতে বিতরণ ভাঙতে চলেছে তবে আমরা এটি একটি অদ্ভুত দুর্ঘটনা হয়ে উঠতে চাই, কিছু সাধারণ অনুমানযোগ্য ব্যবহার নয়।
এখন, হ্যাশটেবল বাস্তবায়নের মধ্যে স্পষ্টতই তাদের দেওয়া আইটেমগুলির কোনও নিয়ন্ত্রণ নেই। তারা তাদের সম্পর্কিত হওয়া রোধ করতে পারে না। সুতরাং করণীয় হ'ল ধ্রুবক এবং বালতি গণনাগুলি স্বতন্ত্র are কিছু ছোট সাধারণ সাধারণ বিষয়গুলির সাথে আপনি বালতিটির মডুলাস নির্ধারণ করতে একা "শেষ" উপাদানটির উপর নির্ভর করছেন না। যতদূর আমি জানি তাদের এটি অর্জনের জন্য প্রধান হতে হবে না, কেবল কপিরাইট করুন।
তবে যদি হ্যাশ ফাংশন এবং হ্যাশটেবল স্বতন্ত্রভাবে লিখিত হয়, তবে হ্যাশ টেবিল জানে না যে হ্যাশ ফাংশন কীভাবে কাজ করে। এটি ছোট কারণগুলির সাথে ধ্রুবক ব্যবহার করা হতে পারে। আপনি যদি ভাগ্যবান হন তবে এটি সম্পূর্ণ ভিন্নভাবে কাজ করতে পারে এবং ননলাইনার হতে পারে। হ্যাশ যদি যথেষ্ট ভাল হয় তবে যে কোনও বালতি গণনা ঠিক আছে। তবে একটি ভৌতিক হ্যাশ টেবিল একটি ভাল হ্যাশ ফাংশন ধরে নিতে পারে না, তাই প্রাথমিক সংখ্যাটি বালতি ব্যবহার করা উচিত। একইভাবে একটি অদ্ভুত হ্যাশ ফাংশনটি একটি বৃহত্ প্রাইম ধ্রুবক ব্যবহার করা উচিত, যাতে কেউ কয়টি বালতি ব্যবহার করেন এমন সম্ভাবনা হ্রাস করতে পারে যা ধ্রুবকটির সাথে একটি সাধারণ কারণ হয়।
অনুশীলনে, আমি মনে করি এটি বালতি সংখ্যার হিসাবে 2 পাওয়ার ব্যবহার করা মোটামুটি স্বাভাবিক। এটি সুবিধাজনক এবং আশেপাশে অনুসন্ধান করতে বা ডান মাত্রার একটি প্রাথমিক সংখ্যা প্রাক-নির্বাচন করে সংরক্ষণ করে। সুতরাং আপনি এমনকি গুণকগুলি ব্যবহার না করার জন্য হ্যাশ ফাংশনের উপর নির্ভর করেন যা সাধারণত নিরাপদ অনুমান। তবে আপনি উপরের মতো হ্যাশ ফাংশনের উপর ভিত্তি করে মাঝে মাঝে খারাপ হ্যাশিং আচরণ পেতে পারেন এবং প্রাইম বালতি গণনা আরও সহায়তা করতে পারে।
"সবকিছুই প্রধান হতে হবে" এই নীতিটি সম্পর্কে বলা যতদূর আমি জানি হ্যাশ টেবিলের উপর ভাল বিতরণের জন্য প্রয়োজনীয় তবে প্রয়োজনীয় শর্ত নয়। এটি অন্যরাও একই নিয়মটি অনুসরণ করেছে বলে ধরে নেওয়ার প্রয়োজন ছাড়াই প্রত্যেককে আন্তঃসংযোগ করতে দেয়।
[সম্পাদনা করুন: প্রাথমিক স্তরের বালতি ব্যবহার করার আরও একটি বিশেষ কারণ রয়েছে, যা যদি আপনি লিনিয়ার পরীক্ষার সাথে সংঘর্ষগুলি পরিচালনা করেন। তারপরে আপনি হ্যাশকোড থেকে একটি স্ট্রাইড গণনা করুন, এবং যদি সেই ধাপটি বালতি গণনার একটি ফ্যাক্টর হিসাবে উপস্থিত হয় তবে আপনি যেখানে শুরু করেছিলেন সেখানে ফিরে আসার আগে আপনি কেবল (বালতি_কাউন্ট / স্ট্রাইড) প্রোবগুলি করতে পারেন। আপনি যে বিষয়টি সবচেয়ে বেশি এড়াতে চান তা অবশ্যই স্ট্রাইড = 0, অবশ্যই বিশেষ-কেসড হওয়া উচিত তবে একটি ছোট পূর্ণসংখ্যার সমান বিশেষ ক্যাসিট বালতি_কাউন্ট / স্ট্রাইডকে এড়াতে আপনি কেবল বালতি_কাউন্টটি প্রাইম তৈরি করতে পারেন এবং কিসের যত্ন নেই পদক্ষেপটি প্রদান করা হয় এটি 0 নয়]