حساب التجزئة هو حساب العنصر الذي يجب وضعه في الصفيف. أن تكون دقيقًا ، يتم وضعه في قائمة الارتباطات. وفقًا لقواعد Java ، إذا كنت ترغب في وضع كائن في hashmap ، فيجب أن يوفر فئة الكائن الخاصة بك طريقة hashcode وإرجاع قيمة عدد صحيح. على سبيل المثال ، تحتوي فئة السلسلة على الطرق التالية:
public int hashcode () {int h = hash ؛ int len = count ؛ if (h == 0 && len> 0) {int Off = Offset ؛ char val [] = value ؛ لـ (int i = 0 ؛ i <len ؛ i ++) {h = 31*h+val [Off ++] ؛ } التجزئة = H ؛ } إرجاع H ؛ } انتبه إلى الحلقة المذكورة أعلاه ، أليس كذلك؟ اسمحوا لي أن أعطيك مثالاً بحيث يكون من السهل فهم ما يصنعه. على سبيل المثال ، هناك سلسلة "ABCDE" التي تستخدم طريقة حساب 31 رقمًا لحساب مجموع هذه السلسلة. سوف تكتب صيغة الحساب التالية:
A*31^4+B*31^3+C*31^2+D*31^1+E*31^0. لاحظ أن A أو B أو C أو D أو E هنا تشير إلى قيم ASCII الخاصة بهم. حلقات مثيرة للاهتمام للغاية ، والتي يمكن استخدامها لحساب الرقم N. يمكن استخراج هذه الحلقة بشكل منفصل كأداة جيدة لحساب القسم:
الفراغ الثابت العام (سلسلة [] args) {int [] a = {1،0} ؛ System.out.println (حساب (2 ، أ)) ؛ } int static private int (int radix ، int [] a) {int sum = 0 ؛ لـ (int i = 0 ؛ i <a.length ؛ ++ i) {sum = sum*radix+a [i] ؛ } إرجاع مجموع ؛ } تقبل الطريقة الثابتة Caculate Radix باعتبارها Cardinality ، وتصنيع A يحاكي عدد الحساب المراد حسابه ، فقط انتبه إلى ترتيب السطح الثابت. على سبيل المثال ، يجب ترتيب السلسلة الثنائية 01 في الصفيف وفقًا لـ {0،1}. الإخراج أعلاه هو 1 ، والذي يفي بالقيمة الحقيقية لـ 01.
فلماذا تستخدم 31 كقاعدة؟ أولاً ، تحتاج إلى فهم لماذا هناك حاجة إلى Hashcode. كل كائن يحسب Hashcode بناءً على القيمة. على الرغم من أن حجم الرمز هذا لا يتطلب تفردًا (لأن هذا سيكون عادة بطيئًا للغاية) ، يجب أن يكون قدر الإمكان ولا يتكرر قدر الإمكان ، لذلك يجب أن تكون العهد الكبير أكبر قدر الإمكان. بالإضافة إلى ذلك ، يمكن تحسين 31*n بواسطة التحويل البرمجي ليتحول اليسار بمقدار 5 بت ثم تقليله بمقدار 1 ، والذي له أداء أعلى. في الواقع ، لا يزال من المثير للجدل اختيار 31 ، يرجى الرجوع إليه هنا.
أعتقد أن هذا الشيء سيظل يؤدي إلى مزيد من التكرار ويجب استخدام أعداد أكبر. لذلك ، ربما قد يكون هناك بعض التغييرات في تنفيذ Java في المستقبل. يقدم المقال التالي استنتاجين:
1. استخدم الأرقام الأولية للكسر
يمكن أن تجعل خصائص الأعداد الأولية (فقط 1 وحدها عوامل) النتيجة التي تم الحصول عليها عن طريق ضربها بأرقام أخرى أسهل في إنتاج تفرد من الطرق الأخرى ، أي أن احتمال الصراع بين قيم كود التجزئة هو الأصغر.
2. الاختيار 31 هو اختيار بعد مراقبة نتائج التوزيع. السبب غير واضح ، لكنه مفيد بالفعل.
بالإضافة إلى ذلك ، سيتم تخزين القيمة المحسوبة الأولى داخليًا ، لأن هذه فئة نهائية (غير قابلة للتغيير) ، أي أن محتوى كائن السلسلة لن يتغير. هذا يمكن أن يحسن الأداء عند وضع HashMap عدة مرات ، ولكن يبدو أنه لا يمكن استخدامه.
لخص
ما ورد أعلاه هو كل شيء عن الأسباب التي تجعل 31 معامل معامل عند تحديد رمز hashcode. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
" مقدمة مفصلة لإعادة كتابة الأساليب hashcode () و equals () "
" شرح مفصل للاختلافات الأساسية والاتصالات بين hashcode () و equals () "
" تحليل رمز المصدر Java لاستخدام HashMap "
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!