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==bhash(a)<<1
এটি সমান্তরাল থেকে যায়; সুতরাং "bad"এবং "dab"একই ফলাফল পাওয়া একটি সমস্যা থেকে যায়। একটি ব্যয়বহুল ব্যয়ের জন্য আমরা এই প্রতিসাম্যতা ভাঙ্গতে পারি:
hash(a)<<1 + hash(a) + hash(b)
ওরফে hash(a)*3 + hash(b)। ( hash(a)একবারে গণনা করা এবং সংরক্ষণের পরামর্শ দেওয়া হয় যদি আপনি শিফট সমাধানটি ব্যবহার করেন)। পরিবর্তে কোন বিজোড় ধ্রুবক 3bijectively একটি "ম্যাপ করবে 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ধ্রুবক (যা মূলত এলোমেলো 0s এবং 1গুলি - এর সাথে বিশেষত এটি একটি 32 বিট নির্দিষ্ট পয়েন্ট ভগ্নাংশ হিসাবে স্বর্ণের অনুপাতের বিপরীত) এর সাথে কিছু সংযোজন এবং একটি জোর যুক্ত করে কিছু স্থানান্তরিত সংস্করণ একসাথে যুক্ত করি । এই বিরতি প্রতিসাম্য এবং প্রবর্তন কিছু "গোলমাল" যদি অন্তর্মুখী কুচি-কুচি করিয়া কাটা বস্তু মান দরিদ্র (অর্থাত, 0 প্রত্যেক উপাদান হ্যাশ কল্পনা - উপরে হ্যান্ডলগুলি এটা ভাল, একটি মলা উৎপাদিত 1এবং 0। পরে প্রতিটি মেশা গুলি আমার সরল 3*hash(a)+hash(b)কেবল একটি আউটপুট 0মধ্যে যে ক্ষেত্রে)।
(সি / সি ++ এর সাথে পরিচিত নন, তাদের size_tজন্য একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার মান যা মেমরির যে কোনও অবজেক্টের আকার বর্ণনা করার জন্য যথেষ্ট বড় a৪ বিট সিস্টেমে এটি সাধারণত একটি bit৪ বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যা হয় .২ বিট সিস্টেমে , একটি 32 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার।)