Hamming-Abstand
# Hamming-Abstand

Der Hamming-Abstand (auch Hamming-Distanz) und das Hamming-Gewicht, benannt nach dem US-amerikanischen Mathematiker Richard Wesley Hamming (1915–1998), sind Maße für die Unterschiedlichkeit von Zeichenketten. Der Hamming-Abstand zweier Blöcke mit gleicher Länge (sogenannter Codewörter) ist dabei die Anzahl der unterschiedlichen Stellen.
Die Hamming-Distanz wird zur Fehlererkennung und zur Fehlerkorrektur benutzt, indem Dateneinheiten, die über eine Übertragungsstrecke empfangen werden, mit gültigen Zeichen verglichen werden. Eine etwaige Korrektur der Zeichen erfolgt nach dem Wahrscheinlichkeitsprinzip. Ob eine Fehlererkennung oder -korrektur stattfinden kann, hängt von der Hamming-Distanz ab.
Häufig handelt es sich um binär dargestellte Zahlen, so zum Beispiel in der Kodierungstheorie. In diesem Fall lässt sich rechnerisch der Vergleich durch eine XOR-Operation und das Abzählen der resultierenden Einsen realisieren. Für andere Zahlensysteme oder Alphabete existieren jedoch ebenfalls wichtige Anwendungen.

## Definition

$\Sigma$ sei ein endliches Alphabet sowie $x=(x_{1},\dots ,x_{n})$ und $y=(y_{1},\dots ,y_{n})$ zwei $n$ Zeichen lange Worte aus $\Sigma ^{n}$. Der Hamming-Abstand zwischen $x$ und $y$ ist definiert als:
    $\Delta (x,y):={\Bigl |}{\bigl \j\in \{1,\dots ,n\}\mid x_{j}\neq y_{j}{\bigr \}}{\Bigr |}$
Zu beachten ist, dass der Hamming-Abstand zugleich eine Metrik auf dem Coderaum ist.

## Beispiele

    00110 und 00100→ Hamming-Abstand=1 12345 und 13344→ Hamming-Abstand=2 Haus und Baum→ Hamming-Abstand=2

## Hamming-Gewicht

Das Hamming-Gewicht einer Zeichenkette ist definiert als die Anzahl der vom Nullzeichen des verwendeten Alphabets verschiedenen Zeichen. Hierbei handelt es sich zugleich um den Hamming-Abstand zum Nullvektor (einer gleich langen Zeichenkette, die nur aus Nullzeichen besteht).

## Hamming-Abstand eines Codes

Unter dem Hamming-Abstand eines Codes versteht man das Minimum aller Abstände zwischen verschiedenen Wörtern innerhalb des Codes.
Beispiel:
    Ein Code besteht aus folgenden drei Wörtern:
    $x=00110,$
    $y=00101,$
    $z=01110.$
    Der Hamming-Abstand zwischen $x$ und $y$ ist 2.
    Um $y$ zu generieren, muss man zwei Bits (von rechts nach links das erste und zweite Bit) ändern: y = x XOR 00011.
    Der Hamming-Abstand zwischen $x$ und $z$ ist 1.
    Um $z$ zu generieren, muss man ein Bit (das vierte) ändern: z = x XOR 01000.
    Der Hamming-Abstand zwischen $y$ und $z$ ist 3.
    Um $z$ zu generieren, muss man drei Bits ändern: z = y XOR 01011.
Der kleinste der drei Abstände ist 1, also ist der Hamming-Abstand des Codes ebenfalls gleich 1.
Wichtig ist die Hamming-Distanz, wenn man Codes entwickeln möchte, die Fehlererkennung (EDC) oder -korrektur (ECC) ermöglichen.
Bei Codes mit Hamming-Abstand $h$ können alle $(h-1)$-Bit-Fehler erkannt werden. In dem Beispiel mit $h=1$ kann somit nicht einmal jeder 1-Bit-Fehler erkannt werden (x↔z fällt nicht auf, alle anderen 1-Bit-Fehler erzeugen ungültige Codes, z. B. 00111 aus x oder y).
Bei $h=2$ können alle 1-Bit-Fehler erkannt werden. Um die Fehler auch korrigieren zu können, muss die Hamming-Distanz auf mindestens $2r+1$ vergrößert werden, wobei $r$ für die Anzahl der korrigierbaren Bit-Fehler steht.
Bei $h=3$ können alle 1-Bit-Fehler erkannt und korrigiert werden. Treten 2-Bit-Fehler auf, werden diese unter Umständen falsch „korrigiert“, da das fehlerhafte Wort möglicherweise den Abstand 1 zu einem anderen gültigen Codewort hat.
Bei $h=4$ können ebenfalls alle 1-Bit-Fehler erkannt und korrigiert werden. Treten 2-Bit-Fehler auf, können diese zwar erkannt, aber nicht mehr korrigiert werden.
Der Hamming-Abstand eines Codes ist notwendigerweise eine positive natürliche Zahl. Ein Code mit Hamming-Abstand 0 ist nicht möglich, da sich in diesem Fall zwei Codewörter nicht unterscheiden ließen.

### Ermitteln des Hamming-Abstands eines Codes

Karnaugh-Veitch-Diagramm :
| 4 | 3 | 2 | 3 | 4 |
| 3 | 2 | 1 | 2 | 3 |
| 2 | 1 | X | 1 | 2 |
| 3 | 2 | 1 | 2 | 3 |
| 4 | 3 | 2 | 3 | 4 |
Die manuelle Ermittlung erfolgt am besten mit dem Karnaugh-Veitch-Diagramm. Dort trägt man für jeden vorkommenden Codewert ein Kreuz ein. Liegen anschließend mindestens zwei Kreuze horizontal oder vertikal direkt aneinander, wobei gegenüberliegende Ränder zusammenfallen, so ist der Hamming-Abstand = 1. Liegen zwei Kreuze entweder nur diagonal aneinander oder mit einem Feld dazwischen horizontal oder vertikal zueinander, so ist der Hamming-Abstand = 2. Das nebenstehende Karnaugh-Veitch-Diagramm für 4 Bit (graue Felder sind zyklische Wiederholungen) zeigt den Abstand eines Codewerts von einem gegebenen (Kreuz). So kann man z. B. erkennen, dass es mit 4 Bit nur zwei Werte mit Hamming-Abstand = 4 gibt, und zwar ein komplementäres Paar.
Bei binären Codes kann der Hamming-Abstand zweier Codewörter $a$ und $b$ auch durch (a XOR b) und das Auszählen der Einsen im Ergebnis ermittelt werden.

## Programmierung

Folgendes Beispiel zeigt eine Implementierung in Pseudocode.

## Anwendungsbeispiel

Bei der Übertragung von Daten muss sichergestellt werden, dass Informationen nicht verfälscht bzw. dass Veränderungen der Daten zumindest bemerkt werden (Erkennen von n-fach-Fehlern) und vielleicht noch korrigiert werden können.
Im folgenden Beispiel hat ein Drehschalter vier Einstellmöglichkeiten. Diese werden elektronisch als binäre Zahl (Codewort) an einen Empfänger übermittelt: 00, 01, 10, 11; Der Empfänger erhält das Codewort, hat aber sonst keine Möglichkeit, die Schalterstellung zu überprüfen oder zu erkennen. Dies ist in technischen Anwendungen bereits der Fall, wenn der Empfänger ein Mikrocontroller ist und der Sender aus den Sensoren innerhalb eines Schalters besteht.
Der Empfänger hat in diesem Szenario keine Möglichkeit, eine Verfälschung bei der Übertragung oder einen Defekt des Schalters (z. B. defekte Sensoren im Schalter) zu erkennen. Mit Hilfe der Hamming-Distanz und entsprechender Codes soll nun ein Weg gefunden werden, Fehler beim Sender oder in der Leitung zu erkennen.
Der Hamming-Abstand zwischen den genannten vier Werten 00, 01, 10, 11 ist jeweils 1, d. h. falls durch einen Fehler nur ein Bit umgekehrt wird, erhält der Empfänger zwar ein anderes, aber ebenso gültiges Codewort. Wird eine 00 zu 01 verfälscht, kann der Empfänger den Fehler allein an der Nachricht nicht erkennen, weil sowohl der gewollte wie auch der verfälschte Wert eine gültige Stellung des Schalters beschreiben.
Um die Situation zu verbessern, einigen sich Sender und Empfänger zunächst darauf, nur bestimmte (dafür aber längere) Codewörter zu verwenden und in einer Tabelle deren Bedeutung festzulegen. Dazu können beide beispielsweise die Codewörter 001, 010, 100, 111 wählen, die jeweils zueinander den Hamming-Abstand von 2 haben – die übrigen vier Codewörter mit drei Bit Länge werden nicht verwendet.
Bei einem einzelnen fehlerhaften Bit (Einfachfehler) verändert sich keines dieser vier Codewörter 001, 010, 100, 111 in eines der anderen drei gültigen Codewörter. Der Empfänger erkennt also, wenn z. B. ein 011 ankommt, dass ein Fehler aufgetreten sein muss. Ein Code mit dem Hamming-Abstand 2 ist aber nicht sicher korrigierbar, wie dieses Beispiel zeigt: Die 011 könnte durch umkehren von nur einem Bit aus einem der drei gültigen Codewörter 001, 010, 111 entstanden sein.
Wenn der Empfänger annimmt, dass nur Einfachfehler auftreten und der Empfänger diese korrigieren möchte, muss er mit dem Sender Codewörter vereinbaren, die jeweils einen Hamming-Abstand ≥ 3 haben, z. B. 01011, 01100, 10010, 10101.
* Wenn der Empfänger nun 01111 empfängt und er annimmt, dass ein Einfachfehler aufgetreten ist, dann kann 01111 nur aus dem gültigen Codewort 01011 entstanden sein, bei dem das mittlere Bit verändert wurde.
* Ein Doppelfehler kann ebenfalls erkannt werden. Da Sender und Empfänger wissen, dass sie nur bestimmte Codewörter verwenden, die sich um mindestens drei Bit (Hamming-Abstand ≥ 3) unterscheiden, fällt auch ein Doppelfehler (nur zwei Bits geändert) auf, der aber mit den gesendeten Informationen nicht korrigiert werden kann.
* Dreifachfehler können nicht mehr erkannt werden, doch die Relevanz von mehrfachen Fehlern nimmt in technischen Systemen ab, da das gleichzeitige Auftreten mehrerer Fehler immer unwahrscheinlicher wird, je mehr Fehler zusammentreffen sollen.
Der Doppelfehler öffnet die Möglichkeit eines Irrtums, wie sich am Beispiel 01111 zeigen lässt: Wenn 01111 durch einen Doppelfehler aus 01100 entstanden sein sollte, aber der Empfänger es für einen Einfachfehler hält und korrigiert, dann wird aus dem eigentlich vom Sender gewollten 01100 durch den Doppelfehler ein 01111 und durch die Korrektur des Empfängers (wegen der Annahme eines Einzelfehlers) fälschlicherweise eine 01011.
Wegen der schon genannten abnehmenden Wahrscheinlichkeit von Mehrfachfehlern (n-fach-Fehlern) mit steigendem n kommt man in den meisten Anwendungen mit einem Hamming-Abstand von 4 (Erkennen von Dreifachfehlern) bis 5 (Korrigieren von Doppelfehlern) aus.
Die notwendige Länge des Codewortes hängt vom geforderten Hamming-Abstand und der Zahl der möglichen Schalterstellungen ab und ist in der oben stehenden Tabelle dargestellt. Dort sieht man beispielsweise, dass für 20 verschiedene Positionen eines Schalters mindestens 8 Bit übertragen werden müssen, wenn alle 20 Codewörter zueinander mindestens den Hamming-Abstand ≥ 3 erreichen sollen.

## Repräsentation der Bit-Kette in einem Hyperwürfel

Die Idee der Hamming-Distanz kann gut mit Hilfe von Hyperwürfeln dargestellt werden. Ein Hyperwürfel ist die Generalisierung eines dreidimensionalen Würfels auf die Dimension $d$. Jeder Knoten der Figur entspricht einer Bitkombination, die auch als Koordinatenangabe im Raum verstanden werden kann. Die minimale Anzahl der Kanten, die traversiert werden müssen, um von einem gültigen Wort eines Codes zu einem anderen gültigen Wort des Codes zu gelangen, entspricht der Hamming-Distanz.

### Beispiel

Wenn im nebenstehenden Würfel mit $d=3$ die beiden Wörter {101, 010} für einen Code gewählt werden, so beträgt die minimale Hamming-Distanz 3. Damit können in einer Sphäre mit dem Abstand 1 um einen Punkt mit einem gültigen Wort (z. B. für das gültige Code-Wort 010) alle Fehler (1-Bit-Fehler) erkannt und korrigiert werden {000, 110, 011}.
Wird ein Code mit den Wörtern {000, 101, 110, 011} gewählt, so beträgt die minimale Hamming-Distanz 2. Mit einem Hamming-Abstand von 2 lassen sich 1-Bit-Fehler lediglich erkennen, aber nicht korrigieren (beispielsweise lässt sich zwar erkennen, dass 111 ein fehlerhaftes Wort darstellt, jedoch nicht, ob es nach 110 oder 011 oder 101 korrigiert werden soll).

## Mindestdistanz

Die Mindestdistanz zwischen zwei benachbarten Codewörtern ist für die Konstruktion eines Codes interessant, der bei $m$ Bitstellen für Nutzinformation $k$ Fehler korrigieren kann. Bei Blockcodes mit fixiertem Alphabet liefern die Singleton-Schranke, die Hamming-Schranke (Stichwort t-perfekt) und die Plotkin-Schranke allgemeinere Aussagen über den maximalen Minimalabstand.
Es gilt für einen Code mit Mindestabstand $h$, dass $k<{\tfrac {h}{2}}$ Fehler korrigierbar und $h-1$ Fehler erkennbar sind.

### Beispiel

Sollen alle 1-Bit-Fehler korrigierbar sein, also $k=1$, so folgt durch Einsetzen und Umstellen $h>2$. Mit $h=3$ kann man aber nur 1-Bit-Fehler korrigieren, 2-Bit-Fehler kann man zwar als Fehler erkennen, aber weder korrigieren noch verlässlich von 1-Bit-Fehlern unterscheiden. Eine Fehlerkorrektur macht aus 2-Bit-Fehlern meist 3-Bit-Fehler.

### Folgerung

Bei jedem Code muss die Hammingdistanz $h$ somit mindestens 3 betragen, damit überhaupt Fehler korrigierbar sind.