Introdução
Este laboratório abordará o uso do método hashCode(int n) da classe Integer do Java. Aprenderemos como gerar um valor inteiro único, conhecido como código hash (hash code), para um determinado valor inteiro.
Este laboratório abordará o uso do método hashCode(int n) da classe Integer do Java. Aprenderemos como gerar um valor inteiro único, conhecido como código hash (hash code), para um determinado valor inteiro.
Crie um arquivo chamado IntegerHashcode.java no diretório ~/project e abra-o em seu editor de texto favorito.
touch ~/project/IntegerHashcode.java
touch ~/project/IntegerHashcode.java
Importe a classe Integer do pacote java.lang.
import java.lang.Integer;
Nesta etapa, geraremos códigos hash para valores inteiros usando o método hashCode(int n). Criaremos uma aplicação que solicita ao usuário que insira um valor inteiro e, em seguida, gera o valor do código hash para o inteiro inserido.
import java.lang.Integer;
import java.util.Scanner;
public class IntegerHashcode {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter an integer value: ");
int value = sc.nextInt();
int hashValue = Integer.hashCode(value);
System.out.println("Hash code value for " + value + " is " + hashValue);
}
}
No código acima, importamos a classe Scanner do pacote java.util para entrada. Solicitamos ao usuário que insira um valor inteiro e o lemos usando o método nextInt() da classe Scanner. Em seguida, geramos o valor do código hash para o inteiro inserido usando o método hashCode(int n) e o imprimimos no console usando o método println().
Salve e feche o arquivo. Compile o arquivo IntegerHashcode.java usando o comando abaixo.
javac IntegerHashcode.java
Execute o programa usando o comando abaixo.
java IntegerHashcode
Você será solicitado a inserir um valor inteiro. Insira qualquer valor inteiro e pressione a tecla Enter. O programa gerará o valor do código hash para o valor inteiro inserido e o exibirá no console.
Vamos modificar a aplicação para gerar códigos hash para múltiplos valores inteiros inseridos pelo usuário.
import java.lang.Integer;
import java.util.Arrays;
import java.util.Scanner;
public class IntegerHashcode {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter number of integer values: ");
int count = sc.nextInt();
int[] values = new int[count];
for (int i = 0; i < count; i++) {
System.out.print("Enter integer value " + (i+1) + ": ");
values[i] = sc.nextInt();
}
int[] hashValues = new int[count];
for (int i = 0; i < count; i++) {
hashValues[i] = Integer.hashCode(values[i]);
}
System.out.println("Entered integer values: " + Arrays.toString(values));
System.out.println("Corresponding hash code values: " + Arrays.toString(hashValues));
}
}
No código acima, adicionamos um loop para ler múltiplos valores inteiros do usuário e gerar valores de código hash para eles. Armazenamos os valores inteiros e os valores de código hash em arrays separados e os imprimimos no console usando o método toString() da classe Arrays.
Salve e feche o arquivo. Compile o arquivo IntegerHashcode.java novamente usando o comando abaixo.
javac IntegerHashcode.java
Execute o programa modificado usando o comando abaixo.
java IntegerHashcode
Siga as instruções para inserir múltiplos valores inteiros. O programa gerará valores de código hash para cada valor inteiro e os exibirá no console.
Uma colisão de código hash (hash code collision) ocorre quando múltiplos objetos geram o mesmo valor de código hash. Embora o método hashCode(int n) gere valores de código hash únicos para qualquer valor inteiro dado, ele não é infalível. Ainda existe a possibilidade de colisões de código hash, especialmente quando os valores de código hash e o algoritmo subjacente que gera os códigos hash não são fortes o suficiente.
Vamos demonstrar uma colisão de código hash usando o método hashCode(int n). Modifique a aplicação gerando valores de código hash para um conjunto de valores inteiros predefinidos, conforme mostrado abaixo.
import java.lang.Integer;
import java.util.Arrays;
public class IntegerHashcode {
public static void main(String[] args) {
int[] values = {100, 200, 300, 400, 500};
int[] hashValues = new int[values.length];
for (int i = 0; i < values.length; i++) {
hashValues[i] = Integer.hashCode(values[i]);
}
System.out.println("Input integer values: " + Arrays.toString(values));
System.out.println("Corresponding hash code values: " + Arrays.toString(hashValues));
}
}
No código acima, predefinimos um array de valores inteiros e geramos valores de código hash para cada um deles. Em seguida, imprimimos os valores de entrada e seus respectivos valores de código hash no console.
Salve e feche o arquivo. Compile o arquivo IntegerHashcode.java pela última vez usando o comando abaixo.
javac IntegerHashcode.java
Execute o programa final usando o comando abaixo.
java IntegerHashcode
Você notará que os valores de código hash de 100 e 200 são os mesmos. Esta é uma colisão de código hash. Embora as colisões de código hash sejam raras, elas podem potencialmente causar problemas com coleções baseadas em hash em Java.
Neste laboratório, aprendemos sobre o método hashCode(int n) da classe Integer do Java. Aprendemos como gerar valores de código hash únicos para valores inteiros usando este método. Também aprendemos como lidar com colisões de código hash e as limitações dos códigos hash em Java.