Um método hashCode () que retorna valores diferentes para cada objeto distinto é a abordagem mais eficiente?

Entendo que retornar o mesmo valor para cada objeto é ineficiente, mas é a abordagem mais eficiente para retornar valores distintos para instâncias distintas?

Se cada objeto obtiver um valor hashCode diferente, não será como armazená-los em um ArrayList?

Resposta 1

Não, não é verdade.

Supondo que seus objetos sejam armazenados em um HashMap (ou Set ... não importa, usaremos o HashMap aqui para simplificar), você deseja que seu método hashCode retorne um resultado de uma maneira que distribua os objetos igualmente que possível.

O código hash deve ser exclusivo para objetos que não são iguais, embora você não possa garantir que isso sempre seja verdade. Por outro lado, se a.equals(b)é verdade, então a.hashCode() == b.hashCode(). Isso é conhecido como contrato de objeto .

Além disso, há problemas de desempenho também. Cada vez que dois objetos diferentes têm o mesmo hashCode, eles são mapeados para a mesma posição no HashMap (ou seja, eles colidem). Isso significa que a implementação do HashMap precisa lidar com essa colisão, que é muito mais complexa do que simplesmente armazenar e recuperar uma entrada.

Também existem muitos algoritmos que se baseiam no fato de que os valores são distribuídos uniformemente por um mapa, e o desempenho se deteriora rapidamente quando o número de colisões aumenta (alguns algoritmos assumem uma função hash perfeita, o que significa que nunca ocorrerão colisões, não haverá duas diferenças). valores são mapeados para a mesma posição no mapa).

Bons exemplos disso são algoritmos probabilísticos e estruturas de dados como o Bloom Filters (para usar um exemplo que parece estar na moda atualmente).

Resposta: 2

Você deseja que o hashCode () seja o mais variado possível para evitar colisões. Se não houver colisões, cada chave ou elemento será armazenado na matriz subjacente por conta própria. (Um pouco como um ArrayList)

O problema é que, mesmo que o hashCode () seja diferente, você ainda pode obter colisões. Isso acontece porque você não possui um intervalo para cada hashCode possível e esse valor deve ser reduzido para um intervalo menor. por exemplo, você tem 16 buckets, o intervalo é de 0 a 15. Como isso é complicado, mas tenho certeza de que você pode ver que, mesmo que todos os códigos de hash sejam diferentes, eles ainda podem resultar em uma colisão (embora seja improvável)

É uma preocupação para ataques de negação de serviço. Normalmente, as strings têm uma taxa de colisão baixa, no entanto, você pode construir deliberadamente strings que possuem o mesmo código de hash. Esta pergunta fornece uma lista de Strings com um hashCode de 0 Por que o hashCode () de String não armazena em cache 0?

Resposta: 3

O método hashCode () não é adequado para colocar objetos em um ArrayList. Embora sempre retorne o mesmo valor para o mesmo objeto, dois objetos podem ter o mesmo código de hash.

Portanto, o método hashCode é usado no objeto-chave ao armazenar itens, por exemplo, um HashMap.

Resposta: 4

Quero tirar uma imagem que esteja olhando para um retângulo de baixo (criando um trapézio) e alterá-lo para o retângulo original. Por exemplo, imagine que você estava no chão tirando uma foto de um ...

Eu tenho uma pergunta com a qual estou lutando. O problema é que eu nem sei exatamente o que devo procurar no google, por isso estou pedindo uma breve explicação aqui no SO. Vamos ...

Eu tropecei recentemente em um problema de subarray de soma máxima modificado, aqui sabemos a soma (digamos que seja S = 2), mas precisamos encontrar uma fatia mais longa da matriz que produza essa soma exata (as médias mais longas devem ...

Eu tenho um aplicativo da web com a seguinte estrutura: src + main + - + java + recursos + webapp + - + WEB-INF + static O diretório estático é o servidor por org.apache.catalina.servlets ....