GetHashCode () e a Pedra Filosofal, ou um breve esboço do rake

Parece que o tópico de dicionários, tabelas de hash e todos os tipos de códigos de hash são pintados de cima a baixo, e a cada segundo desenvolvedor, sendo acordado de um cochilo no início da noite por volta de 01h28, rapidamente esboça o algoritmo de balanceamento de Hashtable em um pedaço de papel, ao longo do caminho provando todas as propriedades em notação big-O.

Talvez estar tão ciente do assunto de nossa conversa possa ser um desserviço ao incutir uma falsa sensação de confiança: "É tão simples!

No fim das contas, pode! O que exatamente pode - em alguns contos de sexta-feira do programador, logo após um curto programa educacional sobre o que é uma tabela hash.

Como o artigo ainda é sexta-feira, o programa educacional será extremamente curto e academicamente pouco rigoroso.

Mesa de hash para os mais pequenos

Certamente, muitos de vocês foram para policlínicas, escritórios de habitação, escritórios de passaportes e outras instituições de um nível elevado de filantropia do modelo antigo. Quando você, inclinando-se para a janela, diga seu sobrenome (endereço, número do passaporte e número de marcas de nascença), a avó dente-de-leão do outro lado acena com a cabeça, sai arrastando os pés para as entranhas do escritório e, em seguida, traz seu pedaço de papel : seja um cartão médico, ou mesmo um novo passaporte.

A magia que não permite que o funcionário mais rápido do mundo encontre o documento necessário entre milhares de outros nada mais é do que uma tabela hash incorporada no mundo físico:

Mesa de hash tubo quente
Mesa de hash tubo quente

Com essa organização de dados, cada objeto possui um código hash correspondente. No caso de uma clínica, o código hash pode ser seu sobrenome.

A própria tabela hash é uma espécie de "cômoda" com gavetas, cada uma das quais contém objetos agrupados de uma determinada maneira por seus códigos hash. Por que, alguém se pergunta, esse agrupamento especial é necessário e por que não usar os próprios valores hash como a inscrição nas caixas? Bem, provavelmente porque um conjunto de caixas para todos os sobrenomes possíveis no mundo não caberá em todas as policlínicas.

: , . "" "", .

( 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