Was Ist Eine Hash-Tabelle? Hashing Und Kollisionen Erklärt

Ob Sie einen Schlüssel in einem Python-dict mit zehn Einträgen suchen oder in einem mit zehn Millionen: Es dauert gleich lange. Das liegt nicht an einer besonders schnellen Sprache. Pythons dict, Javas HashMap und JavaScripts Map sind allesamt Hash-Tabellen, und das gesamte Design existiert, damit Suche, Einfügen und Löschen im Durchschnitt mit O(1) laufen. Die Big-O-Notation nennt diese Suche “konstante Zeit”. Hier ist der Mechanismus, der das verdient. Wie eine Hash-Tabelle einen Schlüssel in einen Array-Index umwandelt Eine Hash-Tabelle ist ein Array plus eine Funktion, die einen Schlüssel in eine Position in diesem Array umwandelt. ...

4. November 2026 · 7 Minuten · 1450 Wörter · SpaghettiCoder

Ownership und Borrowing in Rust erklärt

Ein C-Programm, das einen Buffer freigibt und trotzdem weiter daraus liest, kompiliert problemlos. Danach beschädigt es den Speicher, manchmal sofort, manchmal erst drei Requests später, in einem Teil des Codes, der diesen Buffer nie berührt hat. Rust lehnt dieses Programm schon beim cargo build ab, ganz ohne Garbage Collector. Der Compiler verfolgt, wem jeder Wert gehört und wer ihn ansehen darf. Dieses Verfolgen ist Ownership und Borrowing. Was sind Rusts Ownership-Regeln? Rusts Ownership-Modell lässt sich auf drei Regeln zurückführen: ...

3. November 2026 · 8 Minuten · 1517 Wörter · SpaghettiCoder

Mock, Stub, Fake und Spy: Test Doubles Erklärt

Ein Test für place_order braucht ein Payment-Gateway, einen SMS-Client und einen Steuerrechner. Setzen Sie die echten Objekte ein: Jeder Testlauf belastet dann eine Karte und verschickt eine SMS an eine echte Telefonnummer. Ein Unit-Test soll in Millisekunden laufen, ohne Netzwerkzugriff — also müssen alle drei durch etwas anderes ersetzt werden. Dieses „etwas andere“ gibt es in fünf Varianten, die jeweils ein anderes Problem lösen. Wer sie für austauschbar hält, erlebt im Code-Review immer wieder dieselbe Debatte: „dann mock das doch einfach“. ...

2. November 2026 · 8 Minuten · 1596 Wörter · SpaghettiCoder

ESLint vs Prettier: Unterschiede und Kombination

Sie speichern eine Datei, Prettier formatiert sie neu, und ESLint meldet sofort einen Fehler in der Zeile, die Prettier gerade angefasst hat. Beide Tools sind konfiguriert, beide laufen, und statt zu helfen, bekämpfen sie sich gegenseitig. Die beiden Tools erledigen unterschiedliche Aufgaben. Das Problem: Beide haben eine Meinung zu genau einer Sache — wie der Code auf der Seite aussieht. Was ESLint tatsächlich prüft ESLint zerlegt Ihren Code in einen abstrakten Syntaxbaum und führt Regeln gegen dessen Struktur aus. Der größte Teil seines Nutzens kommt von Regeln, die echte Bugs finden: eine Variable, die nie definiert wird, ein nicht erreichbares return nach einem anderen return, ein ungenutzter Import, der nach einem Refactoring übrig blieb, ein doppelter Objekt-Key, der den ersten lautlos überschreibt. Das sind semantische Prüfungen — ESLint liest, was der Code tut. ...

1. November 2026 · 6 Minuten · 1212 Wörter · SpaghettiCoder

Reguläre Ausdrücke Erklärt: Wie Regex Wirklich Funktioniert

<.+> gegen <b>bold</b> and <i>italic</i> findet nicht <b>. Es findet die gesamte Zeichenkette, vom ersten < bis zum allerletzten >. Nichts ist defekt. Genau das soll ein greedy Quantifizierer tun, und es ist auch der häufigste “Regex matcht zu viel”-Bug überhaupt. Sobald klar ist, was die Engine beim Lesen des Musters tut, hören dieser Bug und die meisten seiner Verwandten auf, Rätsel zu sein. Wie eine Regex-Engine Ihr Muster Liest Eine Regex-Engine vergleicht Ihr Muster nicht mit der Zeichenkette wie man zwei Zeichenketten auf Gleichheit vergleicht. Die Engines, die Sie täglich nutzen (re in Python, RegExp in JavaScript, PCRE, .NET, Java), sind regex-directed: Sie lesen das Muster von links nach rechts, Token für Token, und versuchen für jedes Token, Zeichen aus der Zeichenkette an der aktuellen Position zu konsumieren. Wenn ein Token passt, rückt die Engine sowohl den Muster-Zeiger als auch den Zeichenketten-Zeiger vor. Wenn ein Token fehlschlägt, macht die Engine Backtracking: Sie geht zum letzten Punkt zurück, an dem sie eine Wahl hatte, etwa ein Quantifizierer, der weniger Zeichen hätte matchen können, oder ein noch nicht probierter Alternationszweig, und probiert die andere Option. ...

28. Oktober 2026 · 8 Minuten · 1508 Wörter · SpaghettiCoder

TypeScript-Generics Erklärt mit Beispielen

Warum geht der übergebene Typ bei any verloren? Wenn Sie einen Parameter als any typisieren, prüft TypeScript nichts mehr von dem, was aus der Funktion kommt: 1 2 3 4 5 6 function firstElement(arr: any[]): any { return arr[0]; } const n = firstElement([1, 2, 3]); n.toUpperCase(); // compiliert, stürzt zur Laufzeit ab Sie wissen, dass Sie ein Array von Zahlen übergeben haben. Der Compiler weiß es nicht, weil any ihm sagt, nicht mehr hinzusehen. n kommt als any zurück, also compiliert der Aufruf einer String-Methode auf einer Zahl klaglos und wirft beim Ausführen TypeError: n.toUpperCase is not a function. ...

27. Oktober 2026 · 7 Minuten · 1481 Wörter · SpaghettiCoder

Exceptions vs Error Values: Wie Sie Eine Strategie Wählen

Öffnen Sie in Python eine Datei, die nicht existiert, wirft open() einen FileNotFoundError, der aus Ihrer Funktion heraus nach oben durchläuft. Tun Sie dasselbe in Go, gibt os.ReadFile einen error-Wert neben einem nil-Byte-Slice zurück. Derselbe Fehlschlag, zwei völlig unterschiedliche Code-Formen darum herum. Der Unterschied ist nicht kosmetisch. Er entscheidet, ob ein Aufrufer den Fehlschlag versehentlich ignorieren kann, und ob der Compiler es merkt, wenn er es tut. Was machen Exceptions und Error Values wirklich unterschiedlich? Eine Exception ist Kontrollfluss, der springt. Etwas schlägt fehl, die Funktion wirft, und die Ausführung verlässt den aktuellen Call-Stack und landet im nächsten passenden catch- oder except-Block, egal wie viele Ebenen weiter oben das ist. Die Signatur der Funktion gibt keinen Hinweis darauf, dass das passieren kann. loadConfig(path: string): Config in TypeScript sieht genau wie eine Funktion aus, die nicht fehlschlagen kann – bis sie bei einer fehlenden Datei eine Exception wirft. ...

26. Oktober 2026 · 8 Minuten · 1538 Wörter · SpaghettiCoder

API Rate Limiting: Algorithmen und wie Sie eines bauen

Ein Client, der in einer Retry-Schleife ohne Backoff feststeckt, kann Ihrer API in einer Minute mehr Last aufbürden als Ihre übrigen zehntausend Clients zusammen. Von Ihrer Seite aus sieht das nicht nach einem Angriff aus. Es sieht nach einem Bug bei ihnen aus, und es wird zum Incident bei Ihnen. Ein Rate Limiter bremst diesen Client, bevor es so weit kommt. Was entscheidet ein Rate Limiter eigentlich? Bei jedem Request stellt der Limiter nur eine Frage: Hat dieser Key im aktuellen Zeitfenster zu viele Requests gemacht? Drei Entscheidungen machen daraus etwas, das Sie implementieren können. ...

23. Oktober 2026 · 7 Minuten · 1489 Wörter · SpaghettiCoder

Intersection Observer: Lazy Loading und Infinite Scroll

Ein scroll-Listener auf window kann während eines einzigen Swipes hunderte Male auslösen. Wer bei jedem dieser Events getBoundingClientRect() für jede Karte in einem Feed aufruft, braucht nur fünfzig Bilder, um die Seite ins Stottern zu bringen. Die Intersection Observer API nimmt diese Prüfung aus dem Scroll-Pfad: Sie registrieren, welche Elemente beobachtet werden sollen, und der Browser meldet sich, wenn sich deren Sichtbarkeit tatsächlich ändert. Wie IntersectionObserver funktioniert Ein Observer beobachtet ein oder mehrere Target-Elemente relativ zu einem Root (standardmäßig der Viewport) und ruft einen Callback auf, sobald ein Target einen Sichtbarkeitsschwellenwert überschreitet. ...

21. Oktober 2026 · 5 Minuten · 1044 Wörter · SpaghettiCoder

Was sind Unicode und die UTF-8-Kodierung

Öffnen Sie eine als UTF-8 gespeicherte Datei in einem Tool, das eine andere Kodierung annimmt, und aus café wird café. Die Bytes auf der Festplatte haben sich nicht geändert. Geändert hat sich nur die Regel, mit der sie wieder in Zeichen zurückverwandelt werden, und die beiden Regeln sind sich nicht einig, was das Byte 0xC3 bedeutet. Die meisten Bugs mit “komischen Zeichen” laufen auf dasselbe hinaus: kaputte Dateinamen, zerstörte Formulareingaben, ein Emoji, das einen Datenbank-Insert zum Absturz bringt, zwei Strings, die identisch aussehen, aber beim Vergleich nicht gleich sind. Jedes Mal werden zwei getrennte Dinge verwechselt: Unicode und UTF-8. ...

20. Oktober 2026 · 8 Minuten · 1492 Wörter · SpaghettiCoder