Jede eingebaute Hash-Methode in C ++?

8

Ich suchte nach md5 für C ++, und ich weiß, dass md5 nicht eingebaut ist (obwohl es viele sehr gute Bibliotheken gibt, die die md5-Funktion unterstützen). Dann realisierte ich, dass ich MD5 nicht wirklich brauche, irgendeine Hashing-Methode wird es tun. Daher habe ich mich gefragt, ob C ++ solche Funktionen hat? Ich meine, eingebaute Hash-Funktionen?

Während ich nach C ++ forschte, sah ich, dass Java, PHP und einige andere Programmiersprachen md5 unterstützen. Zum Beispiel müssen Sie in PHP einfach aufrufen: md5("your string"); .

Eine einfache Hash-Funktion wird ausreichen. (Wenn möglich, fügen Sie bitte einen einfachen Code zur Verwendung bei.)

    
generator 01.06.2011, 11:36
quelle

3 Antworten

11

Das ist einfach. Mit C ++ 11 erhalten Sie ein

%Vor%

funktor was Sie so verwenden können (ungetestet, aber gibt Ihnen die Idee):

%Vor%

Wenn Sie C ++ 11 nicht haben, schauen Sie sich boost an, vielleicht boost::tr1::hash_map . Sie bieten wahrscheinlich auch eine String-Hash-Funktion.

Für sehr einfache Fälle können Sie mit etwas in dieser Richtung beginnen:

%Vor%

Um den Kommentar unten aufzunehmen. Um zu verhindern, dass kurze Zeichenfolgen gruppiert werden, möchten Sie möglicherweise h anders initialisieren. Vielleicht kannst du die Länge dafür verwenden (aber das ist nur meine erste Idee, unbewiesen):

%Vor%

Das sollte nicht schlimmer sein als vorher, aber immer noch weit von perfekt.

    
towi 01.06.2011 11:45
quelle
8

Es hängt davon ab, welche Version von C ++ Sie haben ... und welche Art von Hashfunktion Sie suchen.

C ++ 03 hat keinen Hashing-Container und benötigt daher kein Hashing. Einige Compiler haben jedoch benutzerdefinierte Header vorgeschlagen. Andernfalls kann Boost.Functional.Hash helfen.

C ++ 0x hat die unordered_ -Familie von Containern und somit ein std::hash -Prädikat, das bereits für C ++ - Standardtypen (eingebaute Typen und std::string , zumindest) funktioniert.

Dies ist jedoch ein einfacher Hash, gut genug für Hash-Maps, nicht für die Sicherheit .

Wenn Sie nach kryptografischem Hash suchen, dann ist das Problem völlig anders (und md5 ist looyy), und Sie benötigen eine Bibliothek für (zum Beispiel) einen SHA-2-Hash.

Wenn Sie Geschwindigkeit suchen, besuchen Sie CityHash und MurmurHash . Beide haben Einschränkungen, aber sie sind stark optimiert.

    
Matthieu M. 01.06.2011 11:46
quelle
4

Wie wäre es mit Boost, Boost.Funktional / Hash

>     
Alok Save 01.06.2011 11:43
quelle

Tags und Links