জাদু সংখ্যাটি বুস্টে :: হ্যাশ_কোম্বাইন


94

boost::hash_combineটেমপ্লেট ফাংশন একটি হ্যাশ (যাকে বলা হয় একটি রেফারেন্স লাগে seed) এবং একটি বস্তু vডক্স অনুসারে seedএটি হ্যাশ vবাই এর সাথে একত্রিত হয়েছে

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

আমি দেখতে পাচ্ছি যে এটি নির্বিচারবাদী। আমি দেখি কেন একটি এক্সওআর ব্যবহৃত হয়।

আমি বাজি দিয়েছি যে সংযোজনটি একই সাথে একই মানগুলিকে ম্যাপিং করতে ব্যাপকভাবে পৃথক হয় যাতে হ্যাশ টেবিলগুলি ভেঙে যায় না, তবে কেউ কি যাদু ধ্রুবকটি ব্যাখ্যা করতে পারেন?


প্রদত্ত যে অনেক কম্পিউটারে শিফটের সমান হিসাবে পূর্ণসংখ্যার ঘূর্ণন ব্যয়ের সাথে অভিব্যক্তিটি রূপান্তরিত করার কোনও সুবিধা হতে পারে: <কোড> বীজ ^ = হ্যাশ_ভ্যালু (v) + 0x9e3779b9 + রোল (বীজ, 6) + রটার (বীজ, 2); </code>
জন ইয়েটস

উত্তর:


141

ম্যাজিক সংখ্যাটি 32 টি এলোমেলো বিট হিসাবে গণ্য হয়, যেখানে প্রতিটি সমান 0 বা 1 হওয়ার সম্ভাবনা থাকে এবং বিটের মধ্যে কোনও সহজ সম্পর্ক নেই। এই জাতীয় বিটের স্ট্রিং সন্ধান করার একটি সাধারণ উপায় হ'ল অযৌক্তিক সংখ্যার বাইনারি সম্প্রসারণ ব্যবহার করা; এই ক্ষেত্রে, এই সংখ্যাটি স্বর্ণের অনুপাতের পারস্পরিক

phi = (1 + sqrt(5)) / 2
2^32 / phi = 0x9e3779b9

সুতরাং এই সংখ্যা সহ "এলোমেলোভাবে" বীজের প্রতিটি বিট পরিবর্তন করে; যেমনটি আপনি বলছেন, এর অর্থ এই যে ধারাবাহিক মানগুলি অনেক দূরে থাকবে। পুরানো বীজের স্থানান্তরিত সংস্করণগুলি অন্তর্ভুক্ত করে তা নিশ্চিত করে তোলে, এমনকি hash_value()মানগুলির মোটামুটি ছোট পরিসীমা থাকলেও শীঘ্রই সমস্ত বিটগুলিতে পার্থক্য ছড়িয়ে দেওয়া হবে।


14
কুল! সংখ্যার তত্ত্বটি হঠাৎ দরকারী হয়ে গেলে আমি এটি পছন্দ করি :)
ফ্রেড ফু

8
@larmans আমি আপনার 'হঠাৎ' এর ব্যবহার পছন্দ করি - এটি খুব উপযুক্ত! সংখ্যা তত্ত্বটি "হ্যাঁ, এটি দুর্দান্ত ... তবে সব ক্ষেত্রে 99% ক্ষেত্রে আমি সত্যিকারের কাজটি করতে পারি, দুঃখিত"। এবং তারপরে, আপনি যেমনটি বলেছেন, 'হঠাৎ', সংখ্যা তত্ত্বটি সুপার সুপার useful এটা একটা হাতুড়ি যেখানে এটি মত নয় বরং কিছু সংখ্যক জন্য দরকারী। পরিবর্তে, এটি একটি স্ক্যাল্পেলের মতো অল্প সংখ্যক জিনিসের জন্য অত্যন্ত কার্যকর।
করসিকা

4
@ সামকেললেট আরও ভাল কাজ করতে পারে যদি আপনি সঠিক বন্ধনীগুলির সঠিক নম্বর ব্যবহার করেন এবং পেয়ে থাকেন0x9e3779b97f4a7800
ব্যারি

4
পাইথনের ভাসমান পয়েন্ট সংখ্যাটিতে যথাযথ নির্ভুলতা না থাকায় উপরের 64৪-বিট সোনার অনুপাতটি সঠিক নয়। আসল ফলাফল হওয়া উচিত 0x9e3779b97f4a7c15
কেনেটিএম

4
@Kennytm আপনার মানে নেই 0x9e3779b97f4a7c16? মানে, এটি কেবল 1 বন্ধ।
বিট

25

1997 থেকে বব জেনকিন্সের ডিডিজে নিবন্ধটি একবার দেখুন । যাদু ধ্রুবক ("গোল্ডেন রেশিও") নীচে ব্যাখ্যা করা হয়েছে:

সোনার অনুপাত সত্যিই একটি নির্বিচার মান। এর উদ্দেশ্য হ'ল সমস্ত শূন্যগুলিতে সমস্ত শূন্যকে ম্যাপ করা এড়ানো।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.