Rita,
 
Por definição, uma função de hash possui as seguintes propriedades:
 
   1. Dado um parâmetro qualquer, retorna um número (chamado hashcode).
   2. Repetidas aplicações da função hash sobre o mesmo parâmetro devem retornar o mesmo número***, isto é, "10/10/2002Abacaxi" vai sempre retornar o mesmo hashcode.
 
   3. O ideal seria que fosse retornado um número diferente para cada parâmetro, isto é, seria perfeito se dois parâmetros diferentes sempre resultassem em hashcodes diferentes.
 
Assim, pela própria definição das funções de hash, elas não precisam possuir uma função inversa (que dado um número retorne o parâmetro). E na prática, funções de hash não possuem inversa mesmo..
 
 
Pô! mais pra que serve isso?
 
 
 
Algumas estruturas de dados utilizam o hashcode para armazenar os parâmetros na estrutura. geralmente o hashcode influencia diretamente o índice onde o objeto será armaenado. estas estruturas de dados são conhecidas por estruturas esparças.
 
Agora especificamente em Java.....
 
Java já possui todas as estruturas de dados padrões implementadas, e algumas delas utilizam hashcode, como é o caso do Hashtable. Para que estas estruturas que precisam de um hashcode funcionem para todo tipo de objetos, foi necessário a criação da função hashCode() na classe Object, garantindo que todos os objetos possuissem seu hashcode.
 
_Se não me engano_, esta função foi implementada da forma a retornar um código hash baseado na posição de memória onde o objeto está alocado. Assim, o sinal *** no item 2 quer dizer que é possível que o hashcode mude entre uma execução e outra, mas permanece consante durante durante a execução.
 
 
...Mas vc não está "presa" à função de hash já implementada... você pode implementar a sua própria. para isto basta reimplementar a função hashCode() em seus objetos.
A vantagem seria que como você é quem sabe que tipos de objetos estão sendo colocados em sua estrutura de dados, é muito possível que você consiga implementar uma função de hash que se aproxime mais ao objetivo descrito no item 3, que diz que as estruturas de dados que usam hash possuem uma performance debilitada quando objetos diferentes resultam no mesmo hashcode (isto é chamado de colisão). Novamente, como você é quem conhece os objetos a serem armazenados, você pode implementar uma função de hash específica para seus objetos, que resulte em uma menor probabilidade de colisão no seu caso específico.
 
 
 
 
-Resumindo-
hashCode é muito útil em algumas estruturas de dados, e é usado "internamente", isto é, geralmente não é necessário se preocupar com isso. =p
 
 
 
 
Ufa!
Acho que é só.
 
Espero que isto ajude.
 
 
Luiz Felipe Molina.
----- Original Message -----
Sent: Wednesday, December 11, 2002 3:31 PM
Subject: [java-list] Hashcode

Eu tenho uma String
 
String teste = "10/10/2002Abacaxi"
 
System.out.println(teste.hashCode());
 
Isso me gera um numero, como eu peco a situacao inversa, como eu faço o unHascode ...... ? Qual a finalidade pratica do Hashcode ?
 
Obrigada
 
Rita

Responder a