Hamming-Abstand

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Der Hamming-Abstand (auch Hamming-Distanz) und das Hamming-Gewicht, benannt nach dem US-amerikanischen Mathematiker Richard Wesley Hamming (19151998), sind Maße für die Unterschiedlichkeit von Zeichenketten. Der Hamming-Abstand zweier Blöcke mit fester 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[Bearbeiten]

Sei  \Sigma ein endliches Alphabet, x=(x_1,\dots,x_n) und y=(y_1,\dots,y_n) aus  \Sigma^n , d. h. gleich lange Wörter über diesem Alphabet. Dann definiert man den Hamming-Abstand zwischen x und y als:

\Delta(x,y):=|\left\{j \in \{1,\dots,n\}\mid x_j \neq y_j \right\}|

Zu beachten ist, dass der Hamming-Abstand zugleich eine Metrik auf dem Coderaum ist.

Beispiele[Bearbeiten]

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

Programmbeispiel[Bearbeiten]

In der Programmiersprache C kann das Hamming-Gewicht eines Datenwortes wie folgt ermittelt werden:

  1. int hammingDist(int word1, int word2)
    
  2. {
    
  3.   int weight = 0; // Anzahl 1-Bits, beginnt mit 0
    
  4.   int word = word1 ^ word2; // Ermittle alle unterschiedlichen Bits
    
  5.  
    
  6.   while (word) // Solange noch Bits vorhanden sind...
    
  7.   {
    
  8.     if (word & 1) weight++; // Addiere das unterste Bit
    
  9.     word >>= 1; // Entferne unterstes Bit, verschiebe restliche Bits um 1 nach rechts
    
  10.   }
    
  11.   return weight; // Rückgabe der Anzahl der Bits
    
  12. }
    

bzw. alternativ mit dem schneller terminierenden Algorithmus von Wegner:[1]

  1.   weight++;
    
  2.   word &= word - 1;
    

Hamming-Gewicht[Bearbeiten]

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

Bei ganzen Zahlen in Binärdarstellung ist es die Anzahl der gesetzten Bits. Beispiel: Das Hamming-Gewicht von 1011 ist gleich 3.

Hamming-Abstand eines Codes[Bearbeiten]

Unter dem Hamming-Abstand eines Codes versteht man das Minimum aller Abstände zwischen 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. Eine falsche „Korrektur“ ist ab 3-Bit-Fehlern möglich.

Der Hamming-Abstand eines Codes ist notwendigerweise eine 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[Bearbeiten]

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.

Anwendungsbeispiel[Bearbeiten]

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 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 aber 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 stehende 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[Bearbeiten]

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[Bearbeiten]

Hyperwürfel mit d = 1 bis d = 4

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[Bearbeiten]

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[Bearbeiten]

Sollen alle Einzelfehler korrigierbar sein, also k = 1, so folgt durch Einsetzen und Umstellen h > 2. Mit h = 3 kann man 2-Bit-Fehler zwar erkennen, aber nur Einzelfehler auch korrigieren.

Folgerung[Bearbeiten]

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

Siehe auch: Hamming-Ähnlichkeit, Hamming-Code, Levenshtein-Distanz, Gray-Code

Literatur[Bearbeiten]

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1.  Peter Wegner: A technique for counting ones in a binary computer. In: Communications of the ACM. 3, Nr. 5, 1960, S. 322, doi:10.1145/367236.367286.