Dubbel hasch - Double hashing

Double hashing är en datorprogrammeringsteknik som används i samband med öppen adressering i hashtabeller för att lösa hashkollisioner , genom att använda en sekundär hash av nyckeln som en förskjutning när en kollision inträffar. Dubbel hash med öppen adressering är en klassisk datastruktur på ett bord .

Dubbelhashningstekniken använder ett hashvärde som ett index i tabellen och kliver sedan upprepade gånger ett intervall tills det önskade värdet har hittats, en tom plats har uppnåtts eller hela tabellen har sökts; men detta intervall bestäms av en andra, oberoende hash -funktion . Till skillnad från de alternativa metoderna för kollisionsupplösning för linjär sondering och kvadratisk sondering beror intervallet på data, så att värden som mappas till samma plats har olika skoptsekvenser; detta minimerar upprepade kollisioner och effekterna av gruppering.

Med tanke på två slumpmässiga, enhetliga och oberoende hashfunktioner och är th -platsen i skopssekvensen för värde i en hashtabell med hinkar: Generellt och väljs från en uppsättning universella hashfunktioner ; väljs för att ha ett intervall på och att ha ett intervall på . Dubbel hasch approximerar en slumpmässig fördelning; mer exakt, parvisa oberoende hashfunktioner ger en sannolikhet för att alla par nycklar kommer att följa samma bucket-sekvens.

Urval av h 2 (k)

Den sekundära hashfunktionen bör ha flera egenskaper:

  • det ska aldrig ge ett nollindex
  • den ska gå igenom hela bordet
  • det ska vara väldigt snabbt att beräkna
  • det bör vara parvis oberoende av
  • Distributionsegenskaperna för är irrelevanta. Det är analogt med en slumptalsgenerator.
  • Alla vara relativt bra för | T |.

I praktiken:

  • Om divisionshashning används för båda funktionerna väljs delarna som primtal.
  • Om T är en effekt på 2, uppfylls vanligtvis de första och sista kraven genom att alltid returnera ett udda tal. Detta har en bieffekt av att fördubbla risken för kollision på grund av en bortkastad bit.

Analys

Låt vara antalet element som lagras i , då är belastningsfaktorn . Det vill säga, börja med att slumpmässigt, enhetligt och självständigt välja två universella hash funktioner och bygga en dubbel hash bord . Alla element sätts in genom dubbel hashning med hjälp av och . Med tanke på en nyckel , det är -St hash plats beräknas genom:

Låt ha fast lastfaktor . Bradford och Katehakis visade det förväntade antalet sonder för en misslyckad sökning i , fortfarande använder dessa ursprungligen valda hash -funktioner, är oberoende av fördelningen av ingångarna. Hashfunktionernas parvisa självständighet räcker.

Liksom alla andra former av öppen adressering blir dubbel hashning linjär när hashtabellen närmar sig maximal kapacitet. Den vanliga heuristiken är att begränsa bordslastningen till 75% av kapaciteten. Så småningom kommer rehashing till en större storlek att vara nödvändig, som med alla andra öppna adresseringsscheman.

Varianter

Peter Dillingers doktorsexamen påpekar att dubbel hashning ger oönskade ekvivalenta hashfunktioner när hashfunktionerna behandlas som en uppsättning, som i Bloom -filter : Om och , då och uppsättningarna hashar är identiska. Detta gör en kollision dubbelt så sannolik som man hoppats på .

Det finns dessutom ett betydande antal mest överlappande hash-uppsättningar; om och då , och att jämföra ytterligare hashvärden (utöka intervallet ) är till ingen hjälp.

Trippel hasch

Att lägga till en kvadratisk term (ett triangulärt tal ) eller till och med ( triple hashing ) till hash -funktionen förbättrar hash -funktionen något men åtgärdar inte detta problem; om:

och

sedan

Förbättrad dubbel hasch

Att lägga till en kubik term eller (ett tetrahedralt tal ) löser problemet, en teknik som kallas förbättrad dubbel hashning . Detta kan beräknas effektivt genom framåtskillnad :

struct key;	/// Opaque
/// Use other data types when needed. (Must be unsigned for guranteed wrapping.)
extern unsigned int h1(struct key const *), h2(struct key const *);

/// Calculate k hash values from two underlying hash functions
/// h1() and h2() using enhanced double hashing.  On return,
///     hashes[i] = h1(x) + i*h2(x) + (i*i*i - i)/6.
/// Takes advantage of automatic wrapping (modular reduction)
/// of unsigned types in C.
void ext_dbl_hash(struct key const *x, unsigned int hashes[], unsigned int n)
{
	unsigned int a = h1(x), b = h2(x), i;

	for (i = 0; i < n; i++) { 
		hashes[i] = a;
		a += b;	// Add quadratic difference to get cubic
		b += i;	// Add linear difference to get quadratic
		       	// i++ adds constant difference to get linear
	}
}

Förutom att åtgärda kollisionsproblemet, tar bort dubbel hasch också bort dubbelhashningens numeriska restriktioner för egenskaper, så att en hash-funktion liknande egenskap som (men fortfarande oberoende av) kan användas.

Se även

Referenser

externa länkar