Estou fazendo um trabalho na faculdade e o pedido é que façamos um arquivo (*.txt) que guarde registros de clientes (cpf, nome, endereco, etc) em um arquivo e as chaves que identificam esse registro sejam calculadas atraves de funções de hash.
Pensei no seguinte:
-calcular o hashcode de um campo (cpf, por exemplo) e;
-usar o codigo gerado para indicar a posiçao onde esse registro ficará no arquivo de registros.
Gostaria de saber se estou no caminho certo, se alguem tem ideia de como seria implementado isso.
O hashcode pode se repetir entre diferentes objetos, como já foi dito;
Objetos com hashcodes iguais também devem ser equals. Ou seja, se x.hashCode() == y.hashCode(), então, x.equals(y);
O hashcode não é uma chave primária, conceitualmente. Preste sempre muita atenção na documentação do método que você está reaproveitando. Se o conceito dele não bater EXATAMENTE com a forma que você vai utiliza-lo, não o faça.
No caso de chaves, eu sempre recomendo que elas estejam sob o controle do programador. Por isso, não aconselharia o uso do CPF. O CPF está sob controle do governo e seu sistema pode ter algumas complicações se o governo mudar as regras de geração do número (vai que ele resolve reaproveitar CPFs cancelados, ou incluir letras também na parada).
Claro, como é um trabalho de faculdade e você não está preocupado com manutenções futuras, ok em usar o cpf, mas fica aí a dica.
Como é um trabalho de faculdade, provavelmente você terá de guardar o CPF de qualquer maneira, já que para um número suficientemente grande de CPFs haverá colisão do hash.
(É claro que você sabe tratar colisão em arquivos indexados por hash, não?)
É engraçado que um arquivo-texto seja tratado como um arquivo indexado por hash, mas como é trabalho de faculdade…
Para ficar mais fácil de testar a colisão, use uma função de hash bastante boba (como os dois últimos dígitos do CPF). Assim quase que fatalmente haverá uma colisão, e você terá de tratá-la.