GetHashCode()とPhilosopher's Stone、またはレーキの簡単な概要

辞書、ハッシュテーブル、およびあらゆる種類のハッシュコードのトピックが上下に描かれているように見えます。また、午前1時28分頃の夕方の昼寝から目覚めた開発者は、1枚の紙にハッシュテーブルバランシングアルゴリズムをすばやくスケッチし、同時にすべてのプロパティを証明します。 big-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