ج # جيثاشكود () خوارزمية تجزئة عالية الأداء [مكررة]
-
11-12-2019 - |
سؤال
تكرار ممكن:
ما هي أفضل خوارزمية لنظام تم تجاوزه.كائن.جيثاشكود?
هذا معروف لنا أنه إذا تجاوزنا Equals
طريقة Object
في الأنواع المخصصة لدينا ، يجب علينا أيضا تجاوز وتوفير تنفيذ GetHashCode
طريقة لدعم توليد رموز التجزئة فريدة من نوعها لاستخدامها في دعم Hashtable
و Dictionary
فئات جمع وقد تكون فئات أخرى.
هذا يفرض علينا تنفيذ خوارزمية التجزئة المستخدمة داخل موقعنا overriden
GetHashCode
الطريقة هي الأمثل ودقيقة أي.فإنه يولد تجزئة فريدة من نوعها من نوع وأيضا يفعل ذلك في أسرع وقت ممكن لتحسين أداء التطبيق الذي يستخدم نوع لدينا.
سؤالي هو أي خوارزميات التجزئة دقيقة وتعطي الأداء الأمثل عند استخدامها في GetHashCode
تنفيذ?أو ، هل يجب أن نستخدم النوع الأساسي فقط GetHashCode
تنفيذ?أود أن أعرف هذه الإجابة لكليهما value types
و reference types
..
تحرير:في ما يلي مثال على فصل دراسي أدناه حول سبب حاجتي إلى التجاوز Equals
:
public class Laptop : LaptopBase
{
public readonly string Make;
public readonly string ProcessorArch;
public readonly int MemorySupported;
public readonly int HardDiskGBSupported;
public readonly Color ColorName;
public Laptop(make, procArch, memorySupp, hdGB, color)
{
Make = make;
ProcessorArch = procArch;
MemorySupported = memorySupp;
HardDiskGBSupported = hdGB;
ColorName = color;
}
}
الآن ، أريد أن أعود صحيحا لمثيلات الكمبيوتر المحمول 2 التي تحتوي على جميع الحقول المحددة أعلاه مطابقة مع بعضها البعض بحيث يتطلب تجاوز Equals
و GetHashCode
طريقة وأيضا شرط آخر كما ترون هو أن هذا هو فئة مشتقة ويمكن إعادة استخدامها كذلك ودعم عدد من الأساليب;وبالتالي ، لا يمكن إجراء نوع القيمة (البنية).حاولت مع 2 مثيلات من النوع أعلاه مع جميع حقول المثيل المطابقة وإذا كنت تستخدم التنفيذ الأساسي لـ Equals
- يعود false
حيث أريد أن يكون true
..
كيف يمكنني دعم مثل هذا السيناريو?
المحلول
ذلك يعتمد على نوع يتم تنفيذه على ، ولكن يجب أن تعطي تشتت جيدة من القيم وأنه ليس من الضروري ل جيثاشكود() لإرجاع قيم فريدة من نوعها.يجب أن تستند إلى تلك الحقول المستخدمة في التنفيذ المتساوي ويجب أن تكون هذه الحقول غير قابلة للتغيير.لذلك متطلبات يساوي / جيثاشكود هي نفسها للبنى والطبقات.
وكما قال هينك ، فمن الأفضل عدم تجاوز يساوي/جيثاشكود على الإطلاق...