Analisando Cordas em C ++ Usando um Hash

Hashes são um requisito de segurança importante para aplicações de hoje. UMA jogo da velha cria um equivalente numérico exclusivo de qualquer string que você alimentá-lo. Teoricamente, você não pode duplicar o número que o hash cria usando outro string. Um hash não é reversível - não é o mesmo que criptografia e descriptografia.

Um uso comum para hashes é enviar senhas de um cliente para um servidor. O cliente converte a senha do usuário em um hash numérico e envia esse número para o servidor. O servidor verifica o número, não a senha. Mesmo se as pessoas estão ouvindo, eles não têm nenhuma maneira de saber a senha do número-, portanto, eles não podem roubar a senha para uso com o aplicativo de destino.

A última versão do Code :: Blocks fornece excelente suporte para hashes. No entanto, a fim de usá-lo, você deve ativar o suporte para C ++ 11 extensões. Depois de habilitar o apoio necessário, você pode criar o HashingStrings exemplo mostrado aqui para demonstrar o uso de hash.

#incluir #incluir usando namespace std-int main () {de hash MyHash-cout lt; lt; "O hash de " Olá Mundo "é:" lt; lt; endl-cout lt; lt; MyHash ( "Olá Mundo") lt; lt; endl-cout lt; lt; ", Enquanto o hash de " Goodbye Cruel World "é:" lt; lt; endl-cout lt; lt; MyHash ( "Goodbye Cruel World") lt; lt; endl-retorno 0-}

O exemplo começa com a criação de um objeto de função hash, MyHash. Você usa esse objeto de função para converter texto de entrada para um valor hash. O objeto de função funciona como qualquer outra função, de modo que você pode fornecer o texto de entrada como MyHash ( "Olá Mundo"). Hashes sempre de saída precisamente o mesmo valor dado uma entrada particular. Consequentemente, você deve ver o seguinte resultado deste exemplo.

O hash de "Olá Mundo" é: 4644931while o hash de "Goodbye Cruel World" é: 4.644.988

Hashes têm para além dos requisitos de segurança usos. Por exemplo, você pode criar um recipiente que se baseia em um hash para fazer a localização de um determinado valor mais fácil. Neste caso, você usa um par chave / valor em um mapa hash. O STL utiliza uma real hash_maplt;> modelo.

No entanto, a biblioteca padrão substitui hash_maplt;> com unordered_maplt;>, que significa que você deve ativar o suporte de extensão C ++ para este exemplo. Exceto para o nome do modelo, você pode realmente usar os dois modelos de forma intercambiável, mas usando o hash_maplt;> modelo irá exibir uma mensagem de aviso em versões mais recentes do Code :: Blocks.

o HashMap exemplo mostrado a seguir ilustra como criar um mapa de hash:

#incluir #incluir #include using namespace std-struct eqstr {operador booleano () (const char * s1, char const * s2) const {strcmp retorno (S1, S2) == 0 -}} - int main () {unordered_map, eqstr> Cores-Colors [ "azul"] = 1-Colors [ "verde"] = 2-cores [ "Teal"] = 3-cores [ "tijolo"] = 4-cores [ "roxos"] = 5-cores [ "Brown"] = 6-cores [ "LightGray"] = 7-cout lt; lt; "Brown =" lt; lt; Cores [ "Brown"] lt; lt; endl-cout lt; lt; "Brick =" lt; lt; Cores [ "tijolo"] lt; lt; endl - // Essa chave não está no mapa de hash, então ele retorna um valor // da 0.cout lt; lt; "Red =" lt; lt; Cores [ "vermelho"] lt; lt; endl-}

An (haxixe) mapa não ordenada exige quatro entradas:

  • tipo de chave

  • Tipo de dados

  • função hash

  • chave a igualdade

As primeiras três entradas são simples. Neste caso, o código usa uma string como um tipo de chave, um valor inteiro como um tipo de dados e jogo da velha como a função hash.

A classe Key A igualdade é um pouco mais complexa. Você deve fornecer o mapa hash com um meio de determinar a igualdade. Neste caso, o código compara a sequência de entrada com a cadeia armazenada como a chave.

o eqstr estrutura executa a tarefa de comparar a cadeia de entrada para a chave. A estrutura deve retornar um valor booleano, então o código compara o strcmp função a 0. Quando os dois são iguais, ou seja, as cordas são iguais, eqstr retornos verdade.

O exemplo passa a verificar a existência de três cores, dos quais apenas dois são mostrados no mapa de hash cores. Nos dois primeiros casos, você vê o valor esperado. No terceiro caso, você vê 0, o que indica que cores não contém a tecla desejada.

reserva de sempre 0 como um indicador de erro quando se utiliza um mapa hash, porque o mapa de hash sempre retornará um valor, mesmo que ele não contém a tecla desejada. A saída deste exemplo é:

Brown 6Brick = = = 0 4RED

menu