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.
|
- [java-list] Hashcode Rita Fernandes
- Re: [java-list] Hashcode Josivan de Souza
- [java-list] Iniciante Luiz Felipe Molina
- [java-list] Iniciante Willian Mascaro