3
respostas

O que significa Hash e <>?

Prezados,

O que significa esse Hash? E o simbolo <>? Por que não foi utilizado o () ao invez de <>? String e Conta são parâmetros de Map e HashMap?

// cria o mapa
    Map<String, Conta> mapaDeContas = new HashMap<String, Conta>();
3 respostas

Marcel,

Hash é o mapeamento de dados grandes e de tamanhos variáveis para pequenos dados, de tamanho fixo. Essa redução (resumo) dos dados é feito através de cálculos matemáticos.

Você pode reduzir textos inteiros a um hash com 64 caracteres, por exemplo, aplicando um algoritmo sha256. Uma simples alteração em um único caractere do texto original, já modificaria totalmente o valor hash. Por isso ele é utilizado para salvar senhas em bancos de dados, por exemplo. Você não salva a senha em texto puro, você faz o hash dela e armazena o hash, daí, quando vai validar a senha, gera o hash da senha informada pelo usuário e compara com o hash armazenado para aquele usuário.

Nesse caso aí, os <> são para informar que você está passando 2 tipos de parâmetros genéricos para o Map chamado mapaDeContas. O Map usa uma estrutura do tipo , daí, para cada chave informada, ele te retorna o valor correspondente.

Por exemplo... Se você tem a estrutura:

<"Cliente1", Conta234>
<"Cliente2", Conta567>
<"Cliente3", Conta890>

quando você solicitar o "Cliente1", o Map te retornara o objeto Conta234. Quando solicitar o "Cliente2", receberá o objeto Conta567 e assim sucessivamente.

Os parênteses () indicam a instanciação de objetos, o que é diferente do <>.

Quando você declara um Map, você está dizendo que está criando um Mapa do tipo , onde o primeiro parâmetro (a chave) será do tipo String e o segundo parâmetro (o valor) será um objeto do tipo Conta. Assim, sempre que você pedir pro Map uma Conta, você deverá passar a string (chave) daquele objeto que você deseja receber. Utilizando o exemplo acima, quando você disser que quer o "Cliente2", o seu Map vai te retornar um objeto Conta567 do tipo Conta.

Espero ter ajudado. Se tiver dúvidas, só postar...

Abraço.

Então o Hash utilizado significa que iremos pesquisar um Mapa generalizado em que ao utlizar um hash ele fica encriptado? Apesar de existir caracteres iguais eles seram diferentes por terem bits diferentes que é onde um Hash procura? Me corrija por favor.

E sobre o <>, eu entendi perfeitamente, ao utilizar <> é necessário declarar o tipo de variável e qual variável apontar. E os () significam qual parâmetro se refere.

Me corrija por favor.

Atte.

Marcel Machado

Marcel,

Acredito que você está confundindo um pouco os conceitos.

Hash -> O Hash é uma função matemática que reduz tudo a uma quantidade específica de caracteres. Por exemplo, se você aplicar uma função de hash sha256 em um texto de 1 linha, você terá 64 caracteres. Já se você aplicar uma função de hash sha256 em um texto de 10 páginas, você obterá os mesmos 64 caracteres. É um cálculo matemático feito para retornar um valor teoricamente único para aquele grupo de caracteres do texto, naquele formato. Tanto que se você alterar um caractere ou inserir um espaço no texto e gerar um novo hash, ele será completamente diferente do primeiro. Assim, você pode digitar um texto, aplicar uma função de hash, enviar o texto para outra pessoa e informar o hash do texto original. Se o destinatário aplicar o hash e ele for igual, significa que o texto não foi alterado, caso contrário, o seu texto foi alterado antes de o destinatário recebê-lo (é assim que funciona boa parte das criptografias).

Map -> O Map é um tipo de objetos em Java que trabalha com o conceito de chave e valor. Para cada objeto que você quer guardar, você informa qual será a chave dele. Note que qualquer dos elementos (chave ou valor) podem ser de qualquer tipo. O primeiro tipo declarado será a chave e, o segundo, o valor. Assim, em um Map:

Map<String, Conta> contas;

Você pode dar nome às contas e, toda vez que quiser se referir a elas, basta solicitar ao map a conta que tem o nome (chave) X, que ele te retornará o objeto (valor) com esse nome (chave).

Você pode ter, por exemplo:

Map<String, Integer> numeros;
numeros.put("dois", 1);
numeros.put("um", 5);
numeros.put("quatro", 2);
numeros.put("cinco", 4);

Dessa forma, quando você pedir para o map numeros o valor da chave "dois", ele te retornará o número 1. Quando solicitar o valor da chave "um", ele te retornará o número 5. Quando pedir o valor da chave "quatro", ele te retornará o número 2 e, quando solicitar o valor da chave "cinco", ele te retornará o número 4.

Integer x = numeros.get("dois");
x valerá 1;
Integer y = numeros.get("um");
y valerá 5;
Integer z = numeros.get("quatro");
z valerá 2;
Integer u = numeros.get("cinco");
u valerá 4;

Internamente, o Map utiliza hash para calcular um identificador (um hash) específico para cada uma das chaves e os armazena em estruturas chamadas "tabelas de espalhamento (tabelas de hash)". Assim, ele consegue localizar os elementos muito mais rapidamente. Se você precisa inserir objetos muito rápido, usar HashMap é ruim, pois ele precisa calcular o hash de cada elemento que está sendo inserido (e isso leva um certo tempo). Nesse caso, você deve optar por uma lista. Entretanto, para buscar elementos, o hash é muito mais eficiente, pois ele só busca na tabela onde está o objeto da chave informada e já te entrega a informação, ou seja, ele não precisa "varrer" uma lista comparando elemento por elemento até encontrar o que foi solicitado.

Sobre a pergunta: Apesar de existir caracteres iguais eles seram diferentes por terem bits diferentes que é onde um Hash procura?

Resposta: caracteres iguais, nas mesmas posições, geram hashes iguais. Vide caso do texto de 1 linha ou 10 páginas que citei.

Sobre o <> sugiro que dê uma olhada em Gerenics do Java. Esse é o nome do recurso.

Se tiver mais alguma dúvida, só avisar.

Abraço.