GetHashCode () وحجر الفيلسوف ، أو مخطط موجز لأشعل النار

يبدو أن موضوع القواميس وجداول التجزئة وجميع أنواع أكواد التجزئة يتم رسمها لأعلى ولأسفل ، وكل مطور ثانٍ ، يتم إيقاظه من قيلولة مبكرة في المساء في حوالي 01:28 صباحًا ، يرسم بسرعة خوارزمية موازنة Hashtable على قطعة من الورق ، ويثبت في نفس الوقت جميع الخصائص في تدوين كبير.

ربما يمكن أن يؤدي إدراك موضوع محادثتنا جيدًا إلى إلحاق الضرر بغرس شعور زائف بالثقة: "الأمر بهذه البساطة!

كما اتضح ، يمكن! ما يمكن العثور عليه بالضبط في زوج من حكايات يوم الجمعة للمبرمجين ، مباشرة بعد برنامج تعليمي موجز حول ماهية جدول التجزئة.

نظرًا لأن المقالة لا تزال يوم الجمعة ، سيكون البرنامج التعليمي قصيرًا للغاية ولن يكون صارمًا أكاديميًا.

جدول تجزئة للصغار

بالتأكيد ، ذهب الكثير منكم إلى العيادات الشاملة ومكاتب الإسكان ومكاتب الجوازات وغيرها من المؤسسات ذات المستوى المتزايد من العمل الخيري من النموذج القديم. عندما تنحني إلى النافذة ، قل اسمك الأخير (العنوان ورقم جواز السفر وعدد الوحمات) ، تومئ جدة الهندباء على الجانب الآخر ، وتنتقل إلى أحشاء المكتب ، ثم بعد وقت قصير أحضر قطعة الورق الخاصة بك : سواء كانت بطاقة طبية أو حتى جواز سفر جديد.

السحر الذي لا يسمح لأسرع موظف في العالم بالعثور على المستند المطلوب من بين آلاف الآخرين ليس أكثر من جدول تجزئة مجسد في العالم المادي:

جدول تجزئة أنبوب دافئ
جدول تجزئة أنبوب دافئ

مع تنظيم البيانات هذا ، يكون لكل كائن رمز تجزئة مطابق. في حالة العيادة ، قد يكون كود التجزئة هو اسمك الأخير.

طاولة التجزئة نفسها هي نوع من "خزانة ذات أدراج" مع أدراج ، يحتوي كل منها على أشياء مجمعة بطريقة معينة بواسطة أكواد التجزئة الخاصة بها. لماذا ، يتساءل المرء ، هل هذه المجموعة الخاصة ضرورية ، ولماذا لا تستخدم قيم التجزئة نفسها كنقش على الصناديق؟ حسنًا ، ربما لأن مجموعة من الصناديق لجميع الألقاب الممكنة في العالم لن تتناسب مع كل عيادة.

: , . "" "", .

( IT), , .

, , - :

  1. - - , .

    , "".

  2. - - .

    , , - , - , .

  3. - - , ( ).

    - , - , . , .

  4. ( , ) . , , - , , - .

( ) .

, EF

. -

public class Document
{
  public Int32 Id {get; set;}
  public String Name {get; set;}
  ...
}

Entity Framework. - .

-:

HashSet<Document> _openDocuments;

- , , :

var newDocument = new Document(); // document is created
_openDocuments.Add(newDocument); // document is open, nobody else can edit it.

context.Documents.Add(newDocument);
await context.SaveChangesAsync(); // so it's safe to write the document to the DB

, test , ?

Boolean test = _openDocuments.Contains(newDocument);

, false, . , - EF Document.

EF Id , ORM . , Id 0, - :

var newDocument = new Document(); // newDocument.Id == 0
_openDocuments.Add(newDocument);

context.Documents.Add(newDocument);
await context.SaveChangesAsync(); // newDocument.Id == 42

, , - , , , Document :

public class Document
{
	public Int32 Id {get; set;}
	public String Name {get; set;}
  
	public override int GetHashCode()
 	{
    return Id;
 	}
}

: - - 0, 42.

: , , , - , GetHashCode Equals . .

, GetHashCode, .

-

- , ( ) , . [20, 20], [30, 30] [20, 20], [20, 20] [30, 30]. , -:

private static IEnumerable<Size> FilterRectangles(IEnumerable<Size> rectangles)
{
	HashSet<Size> result = new HashSet<Size>();
	foreach (var rectangle in rectangles)
    result.Add(rectangle);

	return result;
}

, , - O(n^2), O(n). , Computer Science, , , , .

HashSet , Size - FCL. , , - :

    var a = new Size(20,20).GetHashCode(); // a == 0 
    var b = new Size(30,30).GetHashCode(); // b == 0

, - ( , , , ), , -, .

, , : SizeF, , , :

var a = new SizeF(20,20).GetHashCode(); // a == 346948956
var b = new SizeF(30,30).GetHashCode(); // b == 346948956

, a b ! 346948956...

, - , FCL, :

var a = Int64.MinValue.GetHashCode(); // a == 0
var b = Int64.MaxValue.GetHashCode(); // a == 0

, .... , , .

? , :

  1. .

  2. - ... (. Resharper).

  3. . - .




All Articles