xor
হ্যাশিং ব্যবহার করার জন্য একটি বিপজ্জনক ডিফল্ট ফাংশন। এটি এর চেয়ে ভাল and
এবং এটি বেশি or
কিছু বলে না।
xor
প্রতিসম হয়, তাই উপাদানগুলির ক্রম নষ্ট হয়। সুতরাং "bad"
হ্যাশ হিসাবে একই একত্রিত হবে "dab"
।
xor
শূন্যের সাথে জোড়াবিশিষ্ট অভিন্ন মানচিত্রের মানচিত্র, এবং আপনার "সাধারণ" মানগুলি শূন্যে ম্যাপ করা উচিত:
সুতরাং (a,a)
0-তে ম্যাপযুক্ত হয় এবং 0 (b,b)
তে ম্যাপও হয়ে যায় such কারণ এ জাতীয় জুড়ি প্রায় সবসময়ই এলোমেলোভাবে বোঝার চেয়ে বেশি সাধারণ, আপনি যতটা সম্ভব তার চেয়ে শূন্যে অনেকগুলি সংঘর্ষের সাথে শেষ করেন।
এই দুটি সমস্যা সহ, xor
একটি হ্যাশ সংযোগকারী হিসাবে শেষ হয় যা পৃষ্ঠের অর্ধেক শালীন দেখায়, তবে আরও তদন্তের পরে নয়।
আধুনিক হার্ডওয়্যারটিতে সাধারণত প্রায় দ্রুত গতি যুক্ত করা xor
(এটি সম্ভবত এটি আরও বেশি শক্তি ব্যবহার করে, স্বীকারোক্তি দিয়ে)। যুক্ত করার সত্য সারণীটি xor
প্রশ্নের বিটের মতো, তবে উভয় মান 1 হলে এটি পরবর্তী বিটকে কিছুটা প্রেরণ করে। এর অর্থ এটি কম তথ্য মুছে দেয়।
সুতরাং যে hash(a) + hash(b)
তুলনায় ভাল , ফলাফল 0 পরিবর্তে হয়।hash(a) xor hash(b)
a==b
hash(a)<<1
এটি সমান্তরাল থেকে যায়; সুতরাং "bad"
এবং "dab"
একই ফলাফল পাওয়া একটি সমস্যা থেকে যায়। একটি ব্যয়বহুল ব্যয়ের জন্য আমরা এই প্রতিসাম্যতা ভাঙ্গতে পারি:
hash(a)<<1 + hash(a) + hash(b)
ওরফে hash(a)*3 + hash(b)
। ( hash(a)
একবারে গণনা করা এবং সংরক্ষণের পরামর্শ দেওয়া হয় যদি আপনি শিফট সমাধানটি ব্যবহার করেন)। পরিবর্তে কোন বিজোড় ধ্রুবক 3
bijectively একটি "ম্যাপ করবে k
, নিজেই -বিট" স্বাক্ষরবিহীন পূর্ণসংখ্যা স্বাক্ষরবিহীন পূর্ণসংখ্যার অনুমতি যেমন গণিত মডিউল হয় 2^k
কিছু জন্য k
, এবং যে কোনো বিজোড় ধ্রুবক অপেক্ষাকৃত প্রধানমন্ত্রীর হয় 2^k
।
এমনকি কল্পিত সংস্করণের জন্য আমরা পরীক্ষা করতে পারি boost::hash_combine
, যা কার্যকরভাবে:
size_t hash_combine( size_t lhs, size_t rhs ) {
lhs ^= rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2);
return lhs;
}
এখানে আমরা কিছু seed
ধ্রুবক (যা মূলত এলোমেলো 0
s এবং 1
গুলি - এর সাথে বিশেষত এটি একটি 32 বিট নির্দিষ্ট পয়েন্ট ভগ্নাংশ হিসাবে স্বর্ণের অনুপাতের বিপরীত) এর সাথে কিছু সংযোজন এবং একটি জোর যুক্ত করে কিছু স্থানান্তরিত সংস্করণ একসাথে যুক্ত করি । এই বিরতি প্রতিসাম্য এবং প্রবর্তন কিছু "গোলমাল" যদি অন্তর্মুখী কুচি-কুচি করিয়া কাটা বস্তু মান দরিদ্র (অর্থাত, 0 প্রত্যেক উপাদান হ্যাশ কল্পনা - উপরে হ্যান্ডলগুলি এটা ভাল, একটি মলা উৎপাদিত 1
এবং 0
। পরে প্রতিটি মেশা গুলি আমার সরল 3*hash(a)+hash(b)
কেবল একটি আউটপুট 0
মধ্যে যে ক্ষেত্রে)।
(সি / সি ++ এর সাথে পরিচিত নন, তাদের size_t
জন্য একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার মান যা মেমরির যে কোনও অবজেক্টের আকার বর্ণনা করার জন্য যথেষ্ট বড় a৪ বিট সিস্টেমে এটি সাধারণত একটি bit৪ বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যা হয় .২ বিট সিস্টেমে , একটি 32 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার।)