<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Kuckucks-Hashing</id>
	<title>Kuckucks-Hashing - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Kuckucks-Hashing"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Kuckucks-Hashing&amp;action=history"/>
	<updated>2026-06-04T02:15:33Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Kuckucks-Hashing&amp;diff=2225949&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot: InternetArchiveBot hat 1 Archivlink(s) ergänzt und 0 Link(s) als defekt/tot markiert.) #IABot (v2.0.9.5</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Kuckucks-Hashing&amp;diff=2225949&amp;oldid=prev"/>
		<updated>2026-01-26T22:24:11Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;/index.php?title=Benutzer:InternetArchiveBot&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Benutzer:InternetArchiveBot (Seite nicht vorhanden)&quot;&gt;InternetArchiveBot&lt;/a&gt; hat 1 Archivlink(s) ergänzt und 0 Link(s) als defekt/tot markiert.) #IABot (v2.0.9.5&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Kuckucks-Hashing&amp;#039;&amp;#039;&amp;#039; ({{enS|&amp;#039;&amp;#039;cuckoo hashing&amp;#039;&amp;#039;}}) ist ein [[Algorithmus]], der mittels zweier [[Hashfunktion]]en, zwei mögliche Positionen in einer [[Hashtabelle|Tabelle]] berechnet, an dem das Element eingefügt werden kann. Der Algorithmus garantiert eine konstante Zugriffszeit beim Suchen nach einem Schlüsselwert, da jeder eingefügte Wert an einer der beiden möglichen Positionen abgelegt sein muss. Das heißt, eine u.&amp;amp;nbsp;U. aufwendige Kollisionsbehandlung wie sie bei anderen Hash-Algorithmen während der Suche notwendig ist, entfällt. Die Einfüge Operationen in die Hash-Tabelle sind entsprechend teurer.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus wurde 2001 von Rasmus Pagh und Flemming Friche Rodler entwickelt.&amp;lt;ref&amp;gt;{{Cite book |vauthors=Rasmus Pagh, Flemming Friche Rodler| chapter=Cuckoo Hashing |doi=10.1007/3-540-44676-1_10 |title=Algorithms — ESA 2001 |language =en|series=Lecture Notes in Computer Science |volume=2161| year=2001 |isbn=978-3-540-42493-2}}&amp;lt;/ref&amp;gt; Seinen Namen hat er von dem [[Kuckuck]], der seine Eier in fremde Nester legt und dessen Küken die Eier der Wirtseltern aus dem Nest stoßen.&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Jede der beiden Hashfunktionen berechnet den Index eines einzufügenden Elementes jeweils für eine Tabelle. Zuerst wird geprüft, ob das einzufügende Element mit der Hashfunktion &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; in die Tabelle an der Stelle &amp;lt;math&amp;gt;h(k)&amp;lt;/math&amp;gt; eingefügt werden kann. Ist das der Fall, dann wird das Element dort eingefügt. Wenn der Platz jedoch schon belegt ist, dann wird mit der zweiten Hashfunktion &amp;lt;math&amp;gt;h&amp;#039;(k)&amp;lt;/math&amp;gt; der Platz in der zweiten Tabelle berechnet und, wenn dieser frei ist, dort eingefügt. Ist jedoch der Platz auch belegt, wird das einzufügende Element in die erste Tabelle eingefügt und das Element, das dort vorher war, in die zweite Tabelle verschoben. Wenn nun dort wieder eine Kollision auftritt, dann wird das Element von dort wieder in die erste Tabelle verlegt. Ist der Platz in der ersten Tabelle frei, ist das Einfügen beendet. Sollte jedoch auch hier wieder ein Element den Platz belegen, dann wird es wieder in die zweite Tabelle verschoben. Dieses Verfahren wiederholt man so lange, bis ein freier Platz gefunden wurde. Es kann jedoch vorkommen, dass die gleiche Tabellenkonstellation wie zu Beginn auftritt, damit gerät das Verfahren dann in einen Zyklus (Endlosschleife). In diesem Fall wird die Tabelle mit neuen Hashfunktionen neu aufgebaut.&lt;br /&gt;
&lt;br /&gt;
== Pseudocode ==&lt;br /&gt;
Beispielhafte implementierung der Funktionen &amp;#039;&amp;#039;Lookup&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Insert&amp;#039;&amp;#039; in Pseudocode&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 DEF Lookup(K):&lt;br /&gt;
   // Rückgabe wert: K falls in T1 oder T2 enthalten&lt;br /&gt;
   If K = T1 [H1 (K)]:&lt;br /&gt;
     return K&lt;br /&gt;
   If K = T2 [H2 (K)]:&lt;br /&gt;
     return K&lt;br /&gt;
   return ⟂&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 DEF Insert(K):&lt;br /&gt;
   If lookup(K): //  key[x] schon in Hashtabelle?&lt;br /&gt;
      RETURN&lt;br /&gt;
   LOOP MaxLoop TIMES // versuche max. MaxLoop eine Position zu finden&lt;br /&gt;
     IF T1[H1(K)] =⟂:&lt;br /&gt;
       T1[H1(K)] ← K&lt;br /&gt;
       RETURN&lt;br /&gt;
     ELSE&lt;br /&gt;
       K ↔ T1 [H1 (K)] ;&lt;br /&gt;
       IF T2[H2 (K)] = ⟂:&lt;br /&gt;
          T2[H2(K)] ← K&lt;br /&gt;
          RETURN&lt;br /&gt;
       ELSE&lt;br /&gt;
          K ↔ T2 [H2 (K)];&lt;br /&gt;
&lt;br /&gt;
   // INSERT fehlgeschlagen, rehash der Tabelle und rekursiver Aufruf&lt;br /&gt;
   rehash();&lt;br /&gt;
   insert(K);&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Folgende Hashfunktionen sind gegeben:&lt;br /&gt;
* &amp;lt;math&amp;gt;h\left(k\right)=k\mod 11&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;h&amp;#039;\left(k\right)=\left\lfloor\frac{k}{11}\right\rfloor\mod 11&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! k !! h(k) !! h&amp;#039;(k)&lt;br /&gt;
|-&lt;br /&gt;
| 20 || 9 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 50 || 6 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 53 || 9 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 75 || 9 || 6&lt;br /&gt;
|-&lt;br /&gt;
| 100 || 1 || 9&lt;br /&gt;
|-&lt;br /&gt;
| 67 || 1 || 6&lt;br /&gt;
|-&lt;br /&gt;
| 105 || 6 || 9&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 3 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 36 || 3 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 39 || 6 || 3&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot;| 1. Tabelle für h(k)&lt;br /&gt;
|-&lt;br /&gt;
| || 20 || 50 || 53 || 75 || 100 || 67 || 105 || 3 || 36 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  ||  ||  ||  || 100 || 67 || 67 || 67 || 67 || 100&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||  ||  ||  ||  ||  ||  ||  || 3 || 3 || 36&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||  || 50 || 50 || 50 || 50 || 50 || 105 || 105 || 105 || 50&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 20 || 20 || 20 || 20 || 20 || 20 || 53 || 53 || 53 || 75&lt;br /&gt;
|-&lt;br /&gt;
| 10 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot;| 2. Tabelle für h&amp;#039;(k)&lt;br /&gt;
|-&lt;br /&gt;
| || 20 || 50 || 53 || 75 || 100 || 67 || 105 || 3 || 36 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||  ||  ||  ||  ||  ||  ||  ||  ||  || 3&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||  ||  ||  ||  ||  ||  || 20 || 20 || 20 || 20&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||  ||  ||  ||  ||  ||  ||  ||  || 36 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||  ||  || 53 || 53 || 53 || 53 || 50 || 50 || 50 || 53&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||  ||  ||  || 75 || 75 || 75 || 75 || 75 || 75 || 67&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 8 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| 9 ||  ||  ||  ||  ||  || 100 || 100 || 100 || 100 || 105&lt;br /&gt;
|-&lt;br /&gt;
| 10 ||  ||  ||  ||  ||  ||  ||  ||  ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zyklus ===&lt;br /&gt;
Möchte man nun das Element 6 einfügen, dann gerät man in einen Zyklus. In der letzten Zeile der Tabelle findet sich die gleiche Ausgangssituation wie zu Beginn wieder.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;h\left(6\right)=6\mod 11=6&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;h&amp;#039;\left(6\right)=\left\lfloor\frac{6}{11}\right\rfloor\mod 11=0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| betrachteter Schlüssel || ! colspan=&amp;quot;2&amp;quot; | Tabelle 1 || ! colspan=&amp;quot;2&amp;quot; | Tabelle 2&lt;br /&gt;
|-&lt;br /&gt;
| || alter Wert || neuer Wert || alter Wert || neuer Wert&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 50 || 6 || 53 || 50&lt;br /&gt;
|-&lt;br /&gt;
| 53 || 75 || 53 || 67 || 75&lt;br /&gt;
|-&lt;br /&gt;
| 67 || 100 || 67 || 105 || 100&lt;br /&gt;
|-&lt;br /&gt;
| 105 || 6 || 105 || 3 || 6&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 36 || 3 || 39 || 36&lt;br /&gt;
|-&lt;br /&gt;
| 39 || 105 || 39 || 100 || 105&lt;br /&gt;
|-&lt;br /&gt;
| 100 || 67 || 100 || 75 || 67&lt;br /&gt;
|-&lt;br /&gt;
| 75 || 53 || 75 || 50 || 53&lt;br /&gt;
|-&lt;br /&gt;
| 50 || 39 || 50 || 36 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 36 || 3 || 36 || 6 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 50 || 6 || 53 || 50&lt;br /&gt;
|}&lt;br /&gt;
== Bewertung ==&lt;br /&gt;
Im Vergleich zu alternativen Algorithmen zeigen sich beim Kuckucks-Hash zwei nachteilige Aspekte:&lt;br /&gt;
* die Effizienz der Speicherverwendung ist bei dem vorliegenden Algorithmus vergleichbar schlecht. Ab einer Belegung der Hashtabellen von ca. 50 % sind deutlich mehr Verdrängung notwendig, sodass eine Vergrößerung der Hashtabelle notwendig wird.&amp;lt;ref&amp;gt;{{Literatur |Autor=Rajeev Ranjan Kumar Tripathi, Pradeep Kumar Singh, Sarvpal Singh|Titel=Revisiting Cuckoo Hashing: re-addressing the challenges of Cuckoo Hashing|Sammelwerk=Int. j. inf. tecnol.|Sprache=en| DOI=10.1007/s41870-024-02274-2}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Da der Kuckucks-Hash in vielen Fällen Zugriffe auf bei Hashtabellen benötigt, können CPU-Cache Effekt nicht so gut ausgenutzt werden wie in alternativen Ansätzen. Der 2008 vorgeschlagene Himmel-und-Hölle-Hash (eng. Hopscotch Hash) nutzt [[Cache#Prozessor-Cache|Prozessor-Cash Effekte]] und verbessert die Speicherauslastung.&amp;lt;ref&amp;gt;{{cite conference |last1=Herlihy |first1=Maurice |last2=Shavit |first2=Nir |last3=Tzafrir |first3=Moran |year=2008 |title=Hopscotch Hashing |url=http://mcg.cs.tau.ac.il/papers/disc2008-hopscotch.pdf |conference=22nd International Symposium, DISC 2008 |location=Arcachon, France |publisher=Springer-Verlag |language=en |pages=350–364 |doi=10.1007/978-3-540-87779-0_24 |book-title=DISC &amp;#039;08: Proceedings of the 22nd international symposium on Distributed Computing |archivebot=2026-01-26 22:24:06 InternetArchiveBot |accessdate=2024-12-31 |archiveurl=https://web.archive.org/web/20221220235913/http://mcg.cs.tau.ac.il/papers/disc2008-hopscotch.pdf |archivedate=2022-12-20 |offline=0 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der konstanten Antwortzeiten des Kuckucks-Hashs bietet sich eine Verwendung an, wenn [[Echtzeit]]-Anforderungen zu erfüllen sind.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hash]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>