std::hash für Schlüsselableitungsfunktion spezialisieren
-
Hallo,
ich habe eine (designtechnische) Frage.
Es gibt ja diverse "Hash"-Funktionen deren Anwendungsfelder meistens Passwörter sind (in diesem Fall scrypt).Es gibt dafür verschiedene Implementierungen in C und ich möchte diese jetzt gerne in meine Applikation einfügen. Ich dachte daran, einfach std::hash dafür zu spezialisieren. Ist das sinnvoll? Oder ist das total abstrus und widerspricht dem eigentlichen Funktionsumfang von std::hash und ich sollte einfach eine eigene Klasse dafür schreiben?
Das würde dann etwa so aussehen:
namespace std { template <> struct hash<UserPassword> { std::string operator()(const UserPassword& password) const { return hash_with_scrypt(password); } }; }
-
Das wäre ein bisschen komisch, denn ein konformer std::hash liefert einen std::size_t als Rückgabewert. Was aber ein bisschen wenig Information für einen kryptografischen Hash ist. Das heißt, du hast eine nicht-konforme Spezialisierung erzeugt, wodurch man diese Spezialisierung nirgends benutzen kann, wo ein std::hash erwartet wird. Das ist ja auch kein Wunder, denn ein std::hash dient hauptsächlich als "Sortier"-Kriterium für Hashmaps, nicht für das Speichern von Passwortdatenbanken.
Weiterhin ist das Konzept der Spezialisierung hier ein zweifelhaftes Mittel. Du hast ja anscheinend mehrere verschiedene Funktionen, die aber auf ein und die selbe Art von Daten angewandt werden. Also das Gegenteil von Spezialisierung! Was wäre denn dein Plan gewesen? Unterschiedliche Passwortklassen, je nachdem, wie diese gehasht werden sollen?
Passender wäre wohl eine Reihe von Funktionen, die auf der Passwortklasse arbeiten (oder meinetwegen Member dieser Klasse) und einen Hash zurück liefern. Also so, wie es momentan schon ist. Und Passwortklasse kann einfach eine Zeichenkette sein.