hashCode()

14 respostas
E

alguém pode me explicar por favor como funciona o método hashCode?!

não to sabendo exatamente o que ele retorna, como funciona…

Minha professora pediu que eu o implementasse num trabalho, e eu não sei como fazer isso… não sei pra que serve!

14 Respostas

J

Uma forma de armazenar e resgatar informações de maneira rápida é utilizar uma tabela hash, que armazena o dado com base em um valor inteiro que ele gera a partir do objeto (código hash). Ai quando é preciso resgatar a informação é novamente gerado o código hash do objeto e feita uma pesquisa na tabela e retornado o valor.

Blz?

D

imagine q vc vai armazenar varios dados, e esses dados vao sofrer poucoa alteracao, inserção e exclusão, mas vc vai fazer muita consulta neles, entao vc usa uma tabela hash.

Tipo, vc define um array, muito maior do q vai precisar (há uma boa discussao qto ao tamanho… em média pegue um array 60% maior do q vc precisa).

Bom, dai para cada objeto q vc vai armazenar vc precisa gerar uma chave (trabalho dafuncao hash). Por exemplo, se vc for guardar informacoes sobre um usuario, poderia usar o nome dele para criar uma chave, dai o valor dessa chave seria a posicao do array.

Na hora de pesquisar se um usuario está cadastrado, vc pega o nome, joga pra sua funcao hash. Ela ira retornar a chave, dai vc vai na posicao “chave” do array e se tiver alguma coisa lah, significa q vc achou o nome…

Tudo seria otimo se fosse simples assim, mas pode acontecer de strings diferentes gerarem a mesma chave. Qndo isso ocorrer vc tem duas alternativas: Ou trata essas colisoes (criando uma lista na celula do array) ou fica mo cara em cima da sua funcao hash para q ela naum gere chaves coincidentes para o seu dominio de dados…

OKayz?

H

Uma estrutura de dados muito utilizada é a árvore binária e suas inúmeras variantes (BTree, etc.). Ela está por trás de outras estruturas mais abstratas (hashtable, índices de BD, etc.). É conveniente que a chave usada possua tamanho fixo e seja a mais curta possível.
Exemplo:

chave real: “o Brasil espera que cada um cumpra o seu dever”
hash da chave: 0xa23d1d54 (4 bytes)

chave real: “java”;
hash da chave: 0xf33d21d5 (4 bytes)

Desta maneira, a chave fica normalizada.

_

Observei muitas classes, e vi que o método hashcode retorna um int, e sempre é feito um algoritmo que faz o possível para que não retorne hash repetido para diferentes referências do objeto, muitas vezes é utilizado uma conversão de bits dos atributos do objeto, outros, como Integer, retorna apenas o número, já que não existe dois números diferentes que sejam iguais (eheheh…).

Uma tabela hash armazena os objetos através de uma função realizada utilizando o hashcode do objeto a ser armazenado. Quando várias referências de objetos diferentes levam ao mesmo código hash, esses objetos são armazenados numa lista duplamente encadeada (na maioria das vezes) dentro da alocação de memória que resulta na função. Se o método hascode for mal implementado, os objetos serão armazendas quase sempre na mesma lista… aí para recuperar um objeto na tabela hash vai ser tão demorado quanto pegar num array, por exemplo…

Imagine um objeto Double que o hashcode seria o valor inteiro do número: Se armazenar uma tabela hash, os números 2.0, 2.1, 2.11, 2.22, 2.8, 2.9, etc. seria armazenado no mesmo ponto da tabela. Agora imagina recuperar um número desses…

O resultado hashcode deve haver menas repetições possíveis, para poder ocupar locais diferentes da tabela, para que a recuperação do objeto seja o mais rápido possível para o usuário.

E

hmmm… nesses casos ai tudo bem… mas e se eu estiver usando um HashMap? As chaves do meu HashMap não tem nada a ver o o code do método hashCode? porque eu criei um HashMap e utilizei o metodo hashCode() só pra ver o que ele retornava… apareceu um numero nada a ver !!

Gente, desculpa, é que eu to realmente começando a programar com Java…

_

Tás querendo colocar um HashMap dentro de um HashMap? Se foi isso que entendi, é uma situação bastante bizarra… Acho melhor explicar bem sua idéia para poder visualizar o problema blz?

E

Eu só criei um HashMap e preciso utilizar o método hashCode();
Só não sei pra que, como e onde eu vou utilizá-lo!

:oops:

_

HashMap tem metodo hashcode? Essa eu nao sabia… :roll:
hashcode eh um metodo que deve ser implementado em objetos, para o caso de serem alocados num Hashmap, e o Hashmap utiliza o hascode desses objetos para calcular a funcao e achar o indice para o objeto ser armazenado.

Resumindo, o hashcode deve ser implementado em objetos, o Hashmap utiliza o hashcode para armazenar esses objetos.

E

ah! entao acho que estou entendendo…
bom, o hashCode funciona com o HashMap, mas não vi nenhuma utilidade pra ele… deve ser porque nao tem utilidade né?!
Bom, vou tentar fazer aqui de outro jeito!

Obrigada

_

Bom, o Hashcode é considerado mais útil que outros tipos de armazenamento de dados, devido ao seu tempo de execução para adicionar, remover e localizar objetos.

Por exemplo, imagine um array normal: para adicionar é rápido, só coloca o objeto na última posicao, porem para localizar, o array é varrido um a um até encontrar o objeto ou passar do tamanho do array. Outros tipos de List, como LinkedList, Vector, Set etc, melhora alguns métodos, mas consequentemente, piora outros. Como um dicionário, se vc for procurar numa lista a palavra “zaza”, uma lista iria procurar da latra A até a Z, mesmo voce sabendo que era melhor procurar direto no final.

O Hashmap faz com que um objeto seja inserido removido ou localizado no melhor tempo possível, pois ele calcula uma função utilizando o hashcode do objeto e coloca diretamente naquela posicao. Para lçocaliza-lo, ele calcula o hashcode do objeto a ser localizado e vai direto no local, e vê se ele está lá ou não, sem percisar varrer a lista um a um a lista.

O HashMap é uma das melhores listas de alocação de objetos, mas como toda melhoria resulta em “pioria” (eheheh) algo no hashcode por enquanto é impossível: a lista de objetos nunca será ordenada.

Espero que tenha entendido este mini-tutorial blz?

E

Muito obrigada PARQUE_MACABRO!!!

Agora deu uma boa clareada no negocio!
Valeu mesmo!!!

E

AH! mais uma coisinha:

vc disse que o HashMap calcula uma função utilizando o hashCode… que função é essa? Ou não tem como saber?

F

Essa ta rendendo bem …Boa galera…

Algora uma dica para salvar String no banco para o Hash, usando o UpperCase(), ou LOwerCase()…ja que para cada caracterer A, ou a, o código hash gerádo é diferente…

Valeu!!!

H

Só esticando um pouquinho a conversa…

  • o método hashCode da classe Object, herdado naturalmente por todas as classes, com vistas ao uso por hashtable e hashmap e pelo método equals(), é muito simples e rápido, pois usa o próprio endereço do objeto.
  • em consequência do item anterior, se por algum motivo o objeto for recriado, ele terá um hashcode diferente e hashtable, hashmap e equals falharão fragorosamente.
  • quando o método hashcode for sobrescrito (para evitar a armadilha citada), o método equals também deve ser obrigatoriamente sobrescrito, pois o equals default usa o hashcode default.
Criado 25 de junho de 2004
Ultima resposta 2 de jul. de 2004
Respostas 14
Participantes 6