Hash adaptativa baseada nos dados

De onde veio a ideia

Tabela hash normalmente começa com uma decisão fixa: você define uma função e trabalha em cima dela.

Aqui eu quis fazer um pequeno desvio desse padrão — não mudando a estrutura, mas a forma de escolher a função.

A motivação foi simples: antes de aplicar a função, olhar minimamente para os dados.


O método

A abordagem usada aqui não é nova.

Ela segue uma linha conhecida em hashing: usar propriedades da distribuição das chaves para tentar escolher uma função que se comporte melhor naquele contexto.

No caso, a escolha foi trabalhar com análise de dígitos:

Isso gera um critério simples: usar o dígito menos enviesado como base para o índice.

Não é uma função universal, nem perfeita — é uma heurística baseada no conjunto de entrada.


Por que isso faz sentido

Nem todo dígito carrega a mesma informação.

Dependendo do conjunto, alguns dígitos são praticamente inúteis (muito repetidos), enquanto outros distribuem melhor.

A ideia é justamente evitar escolhas ruins logo de cara.

Em vez de usar, por exemplo, sempre o último dígito, deixar os dados indicarem qual posição tende a espalhar melhor os valores.


O que muda na prática

A função final continua simples:

index = digit % capacity;

Nada sofisticado.

A diferença é que o digit não é fixo — ele é escolhido com base em uma análise prévia.

Isso mantém a implementação leve, mas introduz um pequeno grau de adaptação.


Limitações

Esse tipo de abordagem tem limites claros:

Ou seja, não é solução geral — é uma variação pontual.


Por que explorar isso

O objetivo aqui não foi propor algo novo, mas tornar explícita uma ideia que normalmente fica implícita:

a escolha da função de hash pode (e talvez devesse) considerar os dados

Mesmo que de forma simples.

Implementar isso em C, de maneira direta, foi mais um exercício de exploração do que de otimização.


Fechamento

Esse projeto fica num meio-termo interessante:

não muda a estrutura clássica, mas também não aceita completamente a rigidez dela.

É só um pequeno ajuste de perspectiva — de função fixa para função influenciada pelos dados.

E às vezes esse tipo de ajuste já abre espaço pra pensar diferente.


Código

Você pode encontrar o projeto completo aqui.