[java] 자바에서 해싱 알고리즘을 이용한 문제 해결 방법

해싱 알고리즘은 데이터를 고정된 크기의 해시 값으로 매핑하는 방법입니다. 이는 데이터를 효율적으로 저장하고 검색할 수 있게하여 다양한 문제를 해결하는 데 도움이 됩니다. 자바에서는 다양한 해싱 알고리즘을 제공하고 있으며, 이를 활용하여 문제를 해결할 수 있습니다.

1. 해시맵(HashMap)을 활용한 문제 해결

자바에서 가장 기본적인 해싱 자료구조인 HashMap은 key-value 쌍을 저장하는 데 사용됩니다. 다음은 HashMap을 활용하여 문제를 해결하는 예시 코드입니다.

import java.util.HashMap;

public class HashingExample {
    public static void main(String[] args) {
        // 해시맵 생성
        HashMap<String, Integer> hashMap = new HashMap<>();

        // 데이터 추가
        hashMap.put("Apple", 10);
        hashMap.put("Banana", 5);
        hashMap.put("Orange", 8);
        
        // 데이터 조회
        int appleCount = hashMap.get("Apple");
        System.out.println("Apple 개수: " + appleCount);
        
        // 데이터 수정
        hashMap.put("Banana", 7);
        int bananaCount = hashMap.get("Banana");
        System.out.println("Banana 개수: " + bananaCount);
        
        // 데이터 삭제
        hashMap.remove("Orange");
        System.out.println("Orange 삭제 완료");
    }
}

위의 코드는 간단한 과일 개수를 관리하는 예시입니다. HashMap을 생성한 후에는 put 메소드를 이용하여 key-value 쌍을 추가하고, get 메소드를 이용하여 값을 조회할 수 있습니다. 또한 remove 메소드를 이용하여 원하는 데이터를 삭제할 수도 있습니다. HashMap은 해시 값을 이용하므로 데이터 접근이 O(1)의 시간 복잡도를 가지기 때문에 효율적으로 문제를 해결할 수 있습니다.

2. 해시셋(HashSet)을 활용한 문제 해결

해시셋은 중복되지 않는 데이터를 저장하기 위한 자료구조입니다. 다음은 해시셋을 활용하여 문제를 해결하는 예시 코드입니다.

import java.util.HashSet;

public class HashingExample {
    public static void main(String[] args) {
        // 해시셋 생성
        HashSet<String> hashSet = new HashSet<>();

        // 데이터 추가
        hashSet.add("Apple");
        hashSet.add("Banana");
        hashSet.add("Orange");
        
        // 데이터 조회
        boolean hasApple = hashSet.contains("Apple");
        System.out.println("Apple이 해시셋에 존재하는가? " + hasApple);
        
        // 데이터 삭제
        hashSet.remove("Banana");
        System.out.println("Banana 삭제 완료");
    }
}

위의 코드는 과일의 중복을 허용하지 않고 저장하는 예시입니다. HashSet을 생성한 후 add 메소드를 이용하여 데이터를 추가할 수 있습니다. contains 메소드는 해시셋에 해당 데이터가 있는지 여부를 확인할 수 있으며, remove 메소드를 이용하여 데이터를 삭제할 수 있습니다. HashSet은 해시 값을 이용하여 데이터를 저장하기 때문에 데이터 접근이 O(1)의 시간 복잡도를 가지므로 효율적으로 문제를 해결할 수 있습니다.

3. MessageDigest 클래스를 활용한 문제 해결

자바의 MessageDigest 클래스는 다양한 해싱 알고리즘을 제공하며, 데이터의 해시값을 구하는 데 사용됩니다. 다음은 MessageDigest 클래스를 활용하여 문제를 해결하는 예시 코드입니다.

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashingExample {
    public static void main(String[] args) {
        String inputData = "Hello, World!";
        
        try {
            // 해시 알고리즘 선택
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            
            // 데이터 해싱
            byte[] hashedData = md.digest(inputData.getBytes());
            
            // 해싱 결과 출력
            System.out.println("해싱 결과: " + bytesToHex(hashedData));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
    
    // 바이트 배열을 16진수 문자열로 변환하는 메소드
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

위의 코드는 “Hello, World!” 문자열의 SHA-256 해시 값을 구하는 예시입니다. MessageDigest.getInstance 메소드를 이용하여 원하는 해시 알고리즘을 선택한 후 digest 메소드로 데이터를 해싱합니다. 해시 값은 byte 배열로 반환되며, bytesToHex 메소드를 이용하여 바이트 배열을 16진수 문자열로 변환합니다. MessageDigest 클래스를 이용하면 다양한 해싱 알고리즘을 활용하여 문제를 해결할 수 있습니다.

참고 자료