Hashing
Ordenação e Pesquisa de Dados
Marco Antonio Montebello Júnior
[email protected]
Transformação de Chave Hashing



Transformações de Chave, ou Tabela Hash, ou
Tabelas de Dispersão;
“Hashing”: fazer picadinho, ou fazer uma
bagunça;
Técnica que objetiva organizar um conjunto de
dados, caracterizados por uma chave, de forma
que o acesso tenha o menor custo possível.
Transformação de Chave Hashing


Os registros armazenados em uma tabela são
diretamente endereçados a partir de uma
transformação aritmética sobre a chave de
pesquisa;
O preço pago por esta eficiência será o uso
maior de memória.
Hashing – Espelhamento



Permite agilizar o processo de consulta de
informações
Não requer a realização de ordenação sobre um
conjunto de dados: pesquisa binária e nem a
utilização tabelas de índices
Tornando a operação de inserção, tão rápida
quanto a realização de consulta
Hashing – Espelhamento


Internet: segurança na troca de mensagens pela
Internet - integridade de uma mensagem
Integridade de uma mensagem – assegurar que
a mensagem original não foi modificada um byte
sequer
Hashing na Internet
Explicação didática do conceito
de Hashing – Loja Sears




Há muitos anos atrás criou um sistema para
controlar a carteira de pedidos de venda
comercializados por telefone e catálogo
100 caixas, numeradas de 00 até 99
Os dois dígitos = dois últimos dígitos do número
de telefone do cliente
Essa função hashing ajudava a pesquisa de um
determinado pedido de venda
Explicação didática do conceito
de Hashing – Loja Sears



Para localizar um pedido de venda especifico:
nome do cliente e os dois últimos dígitos do
número telefônico
Todos os pedidos estavam classificados por
esses dois números telefônicos
Apenas uma das 100 caixas era pesquisada
para achar o pedido pelo nome de uma
determinada pessoa
Explicação didática do conceito
de Hashing – Loja Sears


A função hashing utilizada pela Sears
assegurava: distribuição bastante uniforme dos
pedidos pelas caixas
Ainda mais, o tempo de pesquisa de um pedido
era mais ou menos o mesmo em cada uma das
caixas
Outro exemplo de Hashing...
Transformação de Chave – Hashing
Exemplo



Suponhamos um sistema acadêmico que utiliza
como chave o número de matrícula do aluno
(RA) composto por 7 dígitos numéricos;
Para permitir a busca à um registro de um aluno
com um custo constante poderia ser utilizada a
sua própria matrícula como índice de um vetor
vet;
Se isto fosse feito, poderíamos acessar os dados
do aluno cuja matrícula é mat através de
vet[mat];
Transformação de Chave – Hashing
Exemplo


Assim, o acesso ocorre em ordem constante,
entretanto o custo de memória para manter esse
acesso é muito alto;
Vamos considerar que o registro correspondente
a cada aluno tenha a seguinte estrutura:
Transformação de Chave – Hashing
Exemplo



Considerando que o número de matrícula é
composto por 7 dígitos, ele poderia ser
caracterizado por qualquer número entre 0 e
9.999.999;
Assim, existe 10 milhões de possíveis números
de matrícula;
Para isto, seria necessário um vetor com 10
milhões de elementos, que poderia ser
estabelecido por:
Transformação de Chave – Hashing
Exemplo




Dessa forma, o nome do aluno de matrícula mat é
acessado simplesmente através de vet[mat].nome;
Embora o acesso seja rápido o custo de memória é
proibitivo;
Para a struct definida anteriormente teríamos um gasto
de 115 bytes de memória para cada aluno;
Assim, o vetor descrito anteriormente consumiria
1.150.000.000 bytes, ou seja, acima de 1 Gbyte de
memória;
Transformação de Chave – Hashing
Exemplo

Em uma situação prática, seria comum encontrar
um cadastro com algo em torno de 1.000
alunos, o que necessitaria de apenas 115
Kbytes de memória para armazenamento;

Uma forma de resolver o problema do
gasto excessivo de memória, garantindo
um acesso rápido, é através do uso de
tabela hash
Transformação de Chave – Hashing
Exemplo

Um método de pesquisa através de hashing, é
constituído de duas etapas principais:


Computar o valor da função de transformação (função
hashing), a qual transforma a chave de pesquisa em
um endereço de tabela;
Considerando que duas ou mais chaves podem ser
transformadas em um mesmo endereço de tabela, é
necessário existir um método para lidar com
colisões.
Transformação de Chave – Hashing
Exemplo


Mesmo que o número de registros a serem
armazenados seja muito menor do que o
tamanho da tabela, qualquer que seja a função
de transformação, fatalmente ocorrerão algumas
colisões;
Paradoxo do aniversário (Feller, 1968):

“Em um grupo de 23 ou mais pessoas juntas ao
acaso, a probabilidade de que 2 pessoas comemorem
aniversário no mesmo dia é maior do que 50%.”
Transformação de Chave – Hashing
Exemplo



Assim, em uma tabela com 365 endereços a
probabilidade de colisão entre 23 chaves escolhidas
aleatoriamente é maior do que 50%;
Alta probabilidade de colisões, mesmo com distribuição
uniforme;
Exemplos:


Armazenar registros cuja chave é o RG de pessoas, com 7
dígitos numéricos, em uma tabela com 10000 endereços;
Armazenar registros cuja chave consiste de nomes compostos
por até 16 letras (2616 chaves possíveis) em uma tabela com
1000 endereços;
Transformação de Chave – Hashing
Exemplo

Funções de Transformação:



Uma função de transformação deve mapear chaves em inteiros
dentro do intervalo [0..M- 1], onde M é o tamanho da tabela;
A função ideal é aquela que:
 seja simples de ser computada;
 para cada chave de entrada, qualquer uma das saídas possíveis
é igualmente provável de ocorrer.
Considerando que as transformações sobre as chaves
são aritméticas, se houverem chaves não numéricas,
elas devem ser transformadas em números;
Transformação de Chave – Hashing
Exemplo

Um dos métodos que funciona muito bem para a
transformação de chave, utiliza o resto da divisão por M:
h(K) = K mod M



Onde K é um inteiro correspondente à chave;
Este é um método muito simples;
Cuidado na escolha do valor de M:


Se M é par, então h(K) é par quando K é par, e h(K) é ímpar
quando K é ímpar;
Assim, uma boa estratégia é escolher um valor primo para M;
Transformação de Chave – Hashing
Exemplo

Um exemplo de função em linguagem C:
Observações

Verificar página 3 do arquivo

Hashing.pdf
Descrevendo o método da
divisão inteira

Verificar página 10 do arquivo

Hashing.pdf
Espelhamento para chaves
alfanuméricas

Verificar página 11 do arquivo

Hashing.pdf
Tipos de Hashing
Download

Transformação de Chave - Hashing