자 서른 여섯 번째 키워드인 해시코드를 알아 볼 것이다.
이후에 나오는 내용인 해시테이블을 위해서 꼭 알아야하는 지식이라고 생각하고
이전 키워드인 GUID의 정보와 간접적인 연관이 있기 때문에 알아보았다.

해시코드(Hash Code)는 데이터를 빠르게 검색하거나 비교할 수 있도록 변환한 고정된 길이의 문자열, 숫자를 의미한다. 해시코드는 해싱이라는 작업을 하여 만들어지게 되는데, 해싱은 데이터를
특정한 규칙에 따라 짧고 고정된 크기의 값으로 변환하는 과정이다.
해싱의 작업은 데이터의 크기와 관계없이 항상 일정된 크기의 결과를 생성하도록 설계되었다.
Hash Code는 컴퓨터 과학에서 다양한 용도로 사용이 되고 있으며 가장 흔하게 사용되는 예로
해시 테이블, 데이터 무결성 검증, 암호학 등에 사용된다.
보통은 해시코드로 변환하는 알고리즘을 이용하여 작업을 하고 테이블로 관리하는 식으로
이용한다고 한다.
해시 함수는 임의의 크기를 가진 데이터를 고정된 크기의 해시코드로 변환하는 함수이다.
해시 함수의 속성은 다음과 같다.
결정성(Deterministic) - 동일한 입력에 대해 항상 동일한 출력(해시코드)을 생성해야 한다.
효율성(Efficiency) - 해시 함수를 계산하는 과정이 빨라야 한다
균등 분포(Uniform Distribution) - 가능한 한 해시코드가 균등하게 분포되도록 해야 한다.
충돌 저항성(Collision Resistance) - 서로 다른 입력이 동일한 해시코드를 가지는 경우(충돌)를 최소화해야 한다.
MD5(Message-Digest Algorithm 5) - 128비트 해시코드를 생성하는 해시 함수. 널리 사용되었으나 보안 취약점으로 인해 현재는 권장되지 않음.
SHA-1(Secure Hash Algorithm 1) - 160비트 해시코드를 생성하는 해시 함수. 보안 문제로 인해 현재는 사용이 줄어들고 있음.
SHA-256(Secure Hash Algorithm 256) - 256비트 해시코드를 생성하는 해시 함수. SHA-2 계열에 속하며 보안성이 높아 널리 사용됨.
CRC32(Cyclic Redundancy Check 32-bit) - 데이터 무결성 검증에 주로 사용되는 32비트 해시 함수.
해시코드는 주로 해시 테이블에서 사용된다. 해시 테이블은 키-값 쌍을 저장하고 검색할 수 있는 자료구조로, 평균적으로 O(1)의 시간 복잡도로 검색, 삽입, 삭제 작업을 수행할 수 있다.
해시 테이블 구성 요소
버킷(Bucket) - 해시코드가 동일한 데이터를 저장하는 공간.
해시 함수 - 키를 해시코드로 변환하여 버킷의 인덱스를 결정함.
충돌 처리 방법 - 해시 충돌을 해결하기 위한 방법. 대표적인 방법으로 체이닝(Chaining)과 개방 주소법(Open Addressing)이 있음.
해시 충돌은 서로 다른 두 개 이상의 입력이 동일한 해시코드를 생성하는 경우 발생한다.
이를 처리하기 위한 방법은 다음 두 가지가 대표적으로 있다.
체이닝(Chaining) - 동일한 버킷에 여러 개의 요소를 연결 리스트로 저장한다. 충돌이 발생하면 리스트의 끝에 새로운 요소를 추가한다.
개방 주소법(Open Addressing) - 충돌이 발생하면 다른 빈 버킷을 찾아 데이터를 저장한다. 대표적인 방법으로 선형 탐사(Linear Probing), 이차 탐사(Quadratic Probing), 이중 해싱(Double Hashing)이 있다.
데이터 무결성 검증
해시 함수는 데이터 무결성을 검증하는 데 사용된다. 예를 들어, 파일 전송 후 파일의 해시코드를 계산하여 원본 파일의 해시코드와 비교함으로써 데이터가 손상되지 않았는지 확인할 수 있다.
암호학
암호학에서 해시 함수는 비밀번호 저장, 디지털 서명, 메시지 인증 코드(MAC) 등에 사용된다. 해시 함수는 비밀번호를 직접 저장하는 대신 해시값을 저장하여 보안성을 높인다.
체크섬
네트워크 통신에서 데이터의 무결성을 검증하기 위해 체크섬(checksum)을 사용한다. 데이터 패킷의 해시코드를 계산하여 전송하고, 수신 측에서 동일한 해시코드를 계산하여 비교함으로써 데이터가 손상되지 않았는지 확인한다.
보안성: 암호학적 해시 함수는 보안성이 매우 중요하다.
속도: 해시 함수는 빠르게 계산될 수 있어야 한다. 이는 특히 대용량 데이터나 실시간 응용 프로그램에서 중요하다.
출력 크기: 해시 함수의 출력 크기는 용도에 따라 다를 수 있다.
이와 같이 해시코드는 데이터 검색, 저장, 무결성 검증, 보안 등 다양한 분야에서 중요한 역할을 한다.
이를 이해하고 사용하는 것은 컴퓨터 과학 및 소프트웨어 개발에 있어 매우 중요하다.
이 다음 키워드가 해시테이블인데 확실히 깊게 공부하니 어려워지는것은 사실이다.
테이블키워드에서 더욱 자세하게 공부하여 익혀야겠다.