আমি সি # তে একটি দ্রুত, ভাল বিতরণ করা হ্যাশ টেবিল বাস্তবায়ন করতে চাইছি। আমার হ্যাশ-সীমাবদ্ধকরণ ফাংশনটি বেছে নিতে সমস্যা হচ্ছে যা একটি স্বেচ্ছাচারী হ্যাশ কোড নেয় এবং এটি "বাধা" দেয় যাতে এটি বালতিগুলিকে সূচীকরণের জন্য ব্যবহার করা যায়। আমি এখন পর্যন্ত দুটি বিকল্প দেখতে পাচ্ছি:
একদিকে, আপনি নিশ্চিত করতে পারেন যে আপনার বালতিগুলিতে সর্বদা মৌলিক সংখ্যক উপাদান থাকে এবং হ্যাশকে সীমাবদ্ধ করতে আপনি কেবল বালতি সংখ্যার দ্বারা মডুলো করেন। এই সত্য, হয়, কি .NET এর অভিধান করে । এই পদ্ধতির সাথে সমস্যাটি হ'ল অন্যান্য ক্রিয়াকলাপের তুলনায়% ব্যবহার করা অত্যন্ত ধীর; যদি আপনি অ্যাগনার ফগ নির্দেশ টেবিলগুলি দেখুন ,
idiv
(যা এসেম্বলি কোড যা% এর জন্য উত্পন্ন হয়) নতুন ইনটেল প্রসেসরগুলির জন্য 25 ডলার চক্রের একটি নির্দেশের বিলম্ব রয়েছে has জন্য প্রায় 3 এই তুলনাmul
, অথবা 1, bitwise অপস মতand
,or
অথবাxor
।অন্যদিকে, আপনার কাছে বালতিগুলির সংখ্যা সর্বদা ২ এর শক্তি হতে পারে আপনাকে এখনও হ্যাশের মডুলাস গণনা করতে হবে যাতে আপনি অ্যারের বাইরে সূচীকরণের চেষ্টা করবেন না, তবে এবার এটি কম ব্যয়বহুল হবে । 2 ক্ষমতা জন্য যেহেতু
% N
ঠিক হয়& (N - 1)
, constraining একটি মাস্কিং অপারেশন যা শুধুমাত্র 1-2 চক্র লাগে কমে যাবে। এটি গুগলের স্পার্স্যাশ দ্বারা সম্পন্ন হয়েছে । এর খারাপ দিকটি হ'ল আমরা ব্যবহারকারীদের ভাল হ্যাশ সরবরাহ করতে গণনা করছি; হ্যাশকে মুখোশ দেওয়ার ফলে হ্যাশটির কিছু অংশ কেটে যায়, সুতরাং আমরা আর হ্যাশের সমস্ত বিটকে বিবেচনায় নিচ্ছি না। যদি ব্যবহারকারীর হ্যাশটি অসমভাবে বিতরণ করা হয়, উদাহরণস্বরূপ কেবলমাত্র উচ্চতর বিটগুলি পূরণ করা হয় বা নিম্ন বিটগুলি ধারাবাহিকভাবে একই থাকে তবে এই পদ্ধতির সংঘর্ষের হার অনেক বেশি।
আমি এমন একটি অ্যালগরিদম সন্ধান করছি যা আমি উভয় বিশ্বের সেরা ব্যবহার করতে পারি: এটি হ্যাশের সমস্ত বিট বিবেচনায় নেয় এবং এটি% ব্যবহার করার চেয়েও দ্রুত। এটি অগত্যা একটি মডুলাস হতে হবে না, কেবল এমন কিছু যা পরিসরের মধ্যে গ্যারান্টিযুক্ত 0..N-1
(যেখানে এন বালতিগুলির দৈর্ঘ্য) এবং সমস্ত স্লটের জন্য এমনকি বিতরণও রয়েছে। এই জাতীয় অ্যালগরিদম কি বিদ্যমান?
সাহায্য করার জন্যে ধন্যবাদ.
(2^N +/- 1)
, দেখুন stackoverflow.com/questions/763137/...