GetHashCode()和“魔法石”,或耙的简要概述

似乎字典,哈希表和各种哈希码的主题被画上画了下来,第二个开发人员从凌晨约01:28的午睡中醒来,很快在纸上画出了Hashtable平衡算法,同时证明了其中的所有属性。大O表示法。

也许,对我们谈话的话题如此了解可以通过灌输一种错误的信心而损害我们的利益:“就这么简单!这里可能出什么问题了?”

事实证明,可以!在简短的关于哈希表是什么的简短教育程序之后,可以在几个程序员的星期五故事中找到确切的内容。

由于文章仍在星期五,因此教育课程将非常短,而且学术上也不严格。

小孩子的哈希表

当然,你们中的许多人都去了综合诊所,住房办公室,护照办公室和其他慈善机构,这些机构的旧慈善模式有所提高。当您弯腰向窗前说出您的姓氏(地址,护照号码和胎记号码)时,另一边的蒲公英祖母点点头,洗净进入办公室的肠子,然后过一会儿便带上您的纸:是医疗卡,甚至是新护照。

不允许世界上最快的员工在成千上万的其他文件中查找所需文档的魔力,无非是物理世界中体现的哈希表:

暖管哈希表
暖管哈希表

通过这种数据组织,每个对象都有一个对应的哈希码。对于诊所,哈希码可能是您的姓氏。

哈希表本身是一种带有抽屉的“抽屉柜”,每个抽屉都包含按其哈希码以某种方式分组的对象。一个人想知道为什么需要这种特殊的分组,为什么不使用哈希值本身作为包装盒上的铭文呢?好吧,可能是因为世界上所有可能的姓氏都没有一套适合所有诊所的盒子。

: , . "" "", .

( 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