Hash-Algorithmus in C zum Abbilden von 16 Byte-Werten auf 2 Byte-Werte

8

Ich arbeite an einem elektronischen Projekt mit einem Mikrocontroller, der in C programmiert ist.

Ich muss einige IDs und die zugehörigen Informationen in einem Flash-Speicher (SD) speichern. Diese IDs sind 16 Bytes lang, also gibt es 2 ^ 128 mögliche Werte. Obwohl sie 16 Byte sind, werden nur 50000 (eindeutige) Werte verwendet. Es ist physikalisch unmöglich, alle möglichen (2 ^ 128) IDs in einer SD zu speichern.

Ich könnte nur die 50000 verwendeten Werte speichern, aber dann müsste ich alle (im schlimmsten Fall) durchqueren, um den zu finden, den ich brauche. Außerdem müsste für jeden von ihnen ein 16-Byte-Wertevergleich erstellt werden, was ihn ziemlich langsam macht.

Also ich denke, ich würde eine Art von (Hash?) -Funktion benötigen, die die 2 ^ 128 Werte auf 50000 (Karte 16 Bytes bis 2 Bytes) abbildet. Es ist offensichtlich, dass einige der ursprünglichen Werte auf den gleichen Wert / Index abgebildet werden. Die Idee ist, dass, wenn ich eine ID bekomme, ich eine Hash-Funktion verwende, die mir einen Index zwischen 0 und ~ 50000 (0-65535) gibt. Mit diesem Index kann ich direkt auf die SD-Sektoren zugreifen, in denen die ID und die zugehörigen Informationen gespeichert sind. Wie bereits erwähnt, wird sich dieser Index auf eine Speicherposition beziehen, bei der verschiedene IDs koexistieren, da einige IDs auf denselben Indexwert abgebildet werden. Ich würde die richtige ID finden müssen, aber es würde nur ein paar Vergleiche statt der 50000 ursprünglichen kosten.

Jede Idee / Meinung würde wirklich geschätzt werden.

Vielen Dank im Voraus.

    
Noti 13.02.2013, 11:21
quelle

4 Antworten

1

Verwenden Sie einfach 16 MSB der aktuellen ID. Es ist dumm, aber mit Ihren Details wird es funktionieren.

    
Mehraban 13.02.2013 11:36
quelle
1

Da die ID 16 Byte lang ist, möchte ich wissen, dass sie in einer ASCII-Zeichenkette gespeichert ist, also funktioniert ELFhash vielleicht.

%Vor%

wobei M eine Primzahl kleiner als 65536 oder 50000 ist.

Es ist wahrscheinlicher, dass das Präfix vieler ID-Strings identisch ist, weil sie für eine bestimmte Messung stehen. Daher sollten Sie vorsichtiger sein, um Kollisionen zu vermeiden, oder die verknüpfte Liste wird sehr lang sein.

    
jason.foo 13.02.2013 16:08
quelle
1

Sure Mat's ist in Ordnung, dies jedoch durch Verwendung eines Primes sollte zu weniger Kollisionen führen, wo uuid[x] == uuid[y] (und x!=y )

%Vor%

Oder diese Version ist noch besser, weil sie Zusammenstöße reduziert, bei denen die xor der ersten 16 Bits und die zweiten 16 Bits übereinstimmen.

%Vor%     
weston 13.02.2013 13:19
quelle
0
___ qstntxt ___

Ich arbeite an einem elektronischen Projekt mit einem Mikrocontroller, der in C programmiert ist.

Ich muss einige IDs und die zugehörigen Informationen in einem Flash-Speicher (SD) speichern. Diese IDs sind 16 Bytes lang, also gibt es 2 ^ 128 mögliche Werte. Obwohl sie 16 Byte sind, werden nur 50000 (eindeutige) Werte verwendet. Es ist physikalisch unmöglich, alle möglichen (2 ^ 128) IDs in einer SD zu speichern.

Ich könnte nur die 50000 verwendeten Werte speichern, aber dann müsste ich alle (im schlimmsten Fall) durchqueren, um den zu finden, den ich brauche. Außerdem müsste für jeden von ihnen ein 16-Byte-Wertevergleich erstellt werden, was ihn ziemlich langsam macht.

Also ich denke, ich würde eine Art von (Hash?) -Funktion benötigen, die die 2 ^ 128 Werte auf 50000 (Karte 16 Bytes bis 2 Bytes) abbildet. Es ist offensichtlich, dass einige der ursprünglichen Werte auf den gleichen Wert / Index abgebildet werden. Die Idee ist, dass, wenn ich eine ID bekomme, ich eine Hash-Funktion verwende, die mir einen Index zwischen 0 und ~ 50000 (0-65535) gibt. Mit diesem Index kann ich direkt auf die SD-Sektoren zugreifen, in denen die ID und die zugehörigen Informationen gespeichert sind. Wie bereits erwähnt, wird sich dieser Index auf eine Speicherposition beziehen, bei der verschiedene IDs koexistieren, da einige IDs auf denselben Indexwert abgebildet werden. Ich würde die richtige ID finden müssen, aber es würde nur ein paar Vergleiche statt der 50000 ursprünglichen kosten.

Jede Idee / Meinung würde wirklich geschätzt werden.

Vielen Dank im Voraus.

    
___ answer 14852509 ___

Wenn die Bits in Ihrem 128-Bit-Wert "gleichmäßig verteilt" sind, können Sie einfach Folgendes tun:

%Vor%

Es gibt wahrscheinlich andere schlauere Wege, aber diese ist sehr einfach und kann gut genug funktionieren.

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ tag123algorithm ___ Ein Algorithmus ist eine Folge wohldefinierter Schritte, die eine abstrakte Lösung für ein Problem definieren. Verwenden Sie dieses Tag, wenn sich Ihr Problem auf den Algorithmusentwurf bezieht. ___ answer14854535 ___

Sure Mat's ist in Ordnung, dies jedoch durch Verwendung eines Primes sollte zu weniger Kollisionen führen, wo %code% (und %code% )

%Vor%

Oder diese Version ist noch besser, weil sie Zusammenstöße reduziert, bei denen die xor der ersten 16 Bits und die zweiten 16 Bits übereinstimmen.

%Vor%     
___ answer14852646 ___

Verwenden Sie einfach 16 MSB der aktuellen ID. Es ist dumm, aber mit Ihren Details wird es funktionieren.

    
___ tag123hashmap ___ Eine Datenstruktur, die eine Hash-Funktion verwendet, um identifizierende Werte, die als Schlüssel bezeichnet werden, ihren zugehörigen Werten zuzuordnen ___ qstnhdr ___ Hash-Algorithmus in C zum Abbilden von 16 Byte-Werten auf 2 Byte-Werte ___ answer14857808 ___

Da die ID 16 Byte lang ist, möchte ich wissen, dass sie in einer ASCII-Zeichenkette gespeichert ist, also funktioniert ELFhash vielleicht.

%Vor%

wobei M eine Primzahl kleiner als 65536 oder 50000 ist.

Es ist wahrscheinlicher, dass das Präfix vieler ID-Strings identisch ist, weil sie für eine bestimmte Messung stehen. Daher sollten Sie vorsichtiger sein, um Kollisionen zu vermeiden, oder die verknüpfte Liste wird sehr lang sein.

    
___
Mats Petersson 13.02.2013 11:28
quelle

Tags und Links