Analizar cadenas en C ++ usando un hash

Los valores hash son un requisito de seguridad importante para las aplicaciones de hoy en día. LA picadillo crea un equivalente numérico único de cualquier cadena le da de comer. En teoría, no se puede duplicar el número que el hash crea mediante el uso de otra cadena. Un hash no es reversible - no es el mismo que el cifrado y el descifrado.

Un uso común de los hashes es enviar las contraseñas de un cliente a un servidor. El cliente convierte la contraseña del usuario en un hash numérico y envía ese número al servidor. El servidor verifica el número, no la contraseña. Incluso si la gente está escuchando en, no tienen manera de conocer la contraseña del número- por lo tanto no pueden robar la contraseña para su uso con la aplicación de destino.

La última versión de Code :: Blocks ofrece un excelente soporte para hashes. Sin embargo, con el fin de utilizarlo, se debe habilitar el soporte para C ++ 11 extensiones. Después de habilitar el soporte necesario, puede crear la HashingStrings ejemplo que se muestra aquí para demostrar el uso de hashes.

#include #include using namespace std-int main () {hachís MyHash-cout lt; lt; "El hash de " Hola Mundo "es:" lt; lt; endl-cout lt; lt; MyHash ("Hola Mundo") lt; lt; endl-cout lt; lt; "mientras que el hash de " Goodbye Cruel World "es:" lt; lt; endl-cout lt; lt; MyHash ("Goodbye Cruel World") lt; lt; endl retorno 0-}

El ejemplo comienza creando un objeto función hash, MyHash. Se utiliza este objeto función para convertir texto de entrada a un valor hash. El objeto función funciona igual que cualquier otra función, por lo que podría proporcionar el texto de entrada como MyHash ("Hola Mundo"). Hashes siempre salida precisamente el mismo valor dado una entrada particular. En consecuencia, debería ver la siguiente salida de este ejemplo.

El hash de "Hello World" es: 4644931while el hash de "Goodbye Cruel World" es: 4644988

Hashes tienen usos distintos de los requisitos de seguridad. Por ejemplo, puede crear un contenedor que se basa en un hash para realizar la localización de un valor particular más fácil. En este caso, se utiliza un par clave / valor en un mapa hash. El STL utiliza un real hash_maplt;> modelo.

Sin embargo, la biblioteca estándar reemplaza hash_maplt;> con unordered_maplt;>, que significa que debe habilitar el soporte de extensión C ++ para este ejemplo. Excepto por el nombre de la plantilla, se puede utilizar realmente las dos plantillas indistintamente, pero utilizando el hash_maplt;> plantilla mostrará un mensaje de advertencia en las versiones más recientes de Code :: Blocks.

los HashMap ejemplo se muestra a continuación muestra cómo crear un mapa de hash:

#include #include #include usando std-struct espacio de nombres eqstr {bool operador () (const char * s1, const char * s2) const {return strcmp (s1, s2) == 0 -}} - int main () {unordered_map, eqstr> Colores-Colores 1-Colores 2 colores 3-Colores de 4 Colores 5-Colores ["Purple"] = ["ladrillo"] = ["trullo"] = ["verde"] = ["azul"] = ["Brown"] = 6-Colors ["lightgray"] = 7-cout lt; lt; "Brown =" lt; lt; Colores ["Brown"] lt; lt; endl-cout lt; lt; "Brick =" lt; lt; Colores ["ladrillo"] lt; lt; endl - // Esta clave no está en el mapa de hash, lo que devuelve un valor // de 0.cout lt; lt; "Rojo =" lt; lt; Colores ["rojo"] lt; lt; endl-}

Un (hash) mapa desordenada requiere cuatro entradas:

  • Tipo de Clave

  • Tipo de datos

  • Función hash

  • Clave de la Igualdad

Las tres primeras entradas son sencillos. En este caso, el código utiliza una cadena como un tipo de clave, un valor entero como un tipo de datos, y picadillo como la función hashing.

La clase Key La igualdad es un poco más complejo. Debe proporcionar el mapa hash con un medio para determinar la igualdad. En este caso, el código compara la cadena de entrada con la cadena almacenada como la clave.

los eqstr estructura realiza la tarea de la comparación de la cadena de entrada a la tecla. La estructura debe devolver un valor booleano, por lo que el código compara el strcmp función a 0. Cuando los dos son iguales, es decir, las cadenas son iguales, eqstr devoluciones cierto.

El ejemplo va a comprobar si hay tres colores, sólo dos de los cuales aparecen en el mapa de hash Colores. En los dos primeros casos, se ve el valor esperado. En el tercer caso, se ve 0, lo que indica que Colores no contiene la tecla deseada.

Siempre reserva 0 como un indicador de error cuando se utiliza una correlación hash, porque el mapa de hash siempre devolverá un valor, incluso si no contiene la tecla deseada. La salida de este ejemplo es:

Marrón = 6Brick = 4Red = 0



» » » » Analizar cadenas en C ++ usando un hash