لا تجزئة <شار *> وظيفة في STL تعطي 1-1 تعيين بين شار * و size_t؟

StackOverflow https://stackoverflow.com/questions/1817807

  •  08-07-2019
  •  | 
  •  

سؤال

ولدي زوج وأنا أعلم أن قيمة pair.first لا يمكن أن يكون أكثر من 1000. وأعلم أيضا أن pair.second، السلسلة، هو دائما 1 كلمة. أبدا أكثر من 1 كلمة.
لذلك، لبناء قيمة تجزئة للزوج وأنا أفعل ما يلي:

pair<int,string> p;
hash<char*> H;
hash_vale = H(p.second)*1000 + p.first;

وأعتقد أن هذا سوف يعطي القيم الفريدة طالما قيمة التجزئة من السلاسل ليست كبيرة جدا، وسوف أن H (p.second) تعطي 1-1 تعيينات. هل هذه الافتراضات صحيحة؟

شكرا،

هل كانت مفيدة؟

المحلول

وبحكم التعريف، تجزئة لا يمكن أن يكون واحد الى واحد ويرجع ذلك إلى مبدأ برج الحمام. I.E.، وهناك 2 ^ 32 قيم التجزئة ممكنة، ولكن أكثر بكثير السلاسل الممكنة. لذلك يجب أن يكون هناك سلسلتين مع قيمة التجزئة نفسها.

وثانيا، كنت تسبب يكاد يكون من المؤكد تجاوز بضرب قيمة التجزئة عن طريق 1000، منذ تجزئة يجب أن تستخدم كل بت 32. كنت أفضل حالا بكثير تجزئة كثافة العمليات ثم تمزج التجزئة. دفعة لديه وظيفة hash_combine: أ + 0x9e3779b9 + (ب << 6) + (ب >> 2)؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top