해시 함수 에 관한 Wikipedia 기사 는 매우 훌륭하지만 여기서는 제가 설명하겠습니다.
해시는 무엇입니까?
"해시"는 실제로 다른 상황에서 다른 공식적인 의미를 가진 광범위한 용어입니다. 귀하의 질문에 대한 완벽한 대답은 없습니다. 나는 일반적인 기본 개념을 설명하고이 용어의 가장 일반적인 사용법을 언급 할 것입니다.
"해시"는
입력 객체로 취해 문자열 또는 숫자를 출력하는 해시 함수 라고 하는 함수 입니다. 입력 객체는 일반적으로 문자열, 정수 또는 사용자 정의 구조와 같은 다른 객체로 구성된 더 큰 것과 같은 기본 데이터 유형의 멤버입니다. 출력은 일반적으로 숫자 또는 문자열입니다. 명사 "해시"는 종종이 출력을 나타냅니다. 동사 "해시"는 종종 "해시 함수 적용"을 의미합니다. 해시 함수의 주요 속성은 다음과 같습니다.h
- 계산하기 쉽고
- 출력은 상대적으로 작아야합니다.
예:
0에서 999,999,999 사이의 숫자를 0에서 99 사이의 숫자로 해시한다고 가정합니다. 간단한 해시 함수는 있습니다.h(x)=xmod100
일반적인 추가 속성 :
유스 케이스에 따라 해시 함수가 추가 특성을 만족 시키길 원할 수 있습니다. 일반적인 추가 속성은 다음과 같습니다.
균일 성 : 종종 우리는 객체의 해시를 구별하기를 원합니다. 또한 우리는 해시가 "확산"되기를 원할 수 있습니다. 일부 객체를 100 버킷으로 해시하려면 (해시 함수의 출력은 0-99의 숫자입니다) 일반적으로 약 1/100 객체가 버킷 0에, 약 1/100 랜드에 도달하기를 희망합니다 버킷 1 등.
암호화 충돌 저항 : 때때로 이것은 예를 들어 암호화에서 더 멀리 가져옵니다. 해적 함수가 원수가 동일한 출력에 매핑되는 두 개의 다른 입력을 찾기가 어려울 수 있도록 해시 함수를 원할 수 있습니다.
압축 : 종종 임의의 큰 입력을 일정한 크기의 출력 또는 고정 된 수의 버킷으로 해시하고 싶습니다.
결정 : 실행 사이에 출력이 변경되지 않는 해시 함수를 원할 수 있습니다. 즉 동일한 객체에서 해시 함수의 출력은 항상 동일하게 유지됩니다. 이것은 위의 균일 성과 충돌하는 것처럼 보일 수 있지만 한 가지 해결책은 해시 함수를 무작위로 한 번 선택하고 실행간에 변경하지 않는 것입니다.
일부 응용
일반적인 응용 프로그램 중 하나는 사전을 구현하는 방법 인 해시 테이블과 같은 데이터 구조에 있습니다. 여기에 100 개의 "버킷"과 같은 메모리를 할당합니다. 그런 다음 사전에 (키, 값) 쌍을 저장하라는 메시지가 표시되면 키를 0-99로 해시하고 해당 버킷의 쌍을 메모리의 해당 버킷에 저장합니다. 그런 다음 키를 조회하라는 메시지가 표시되면 동일한 해시 함수를 사용하여 키를 숫자 0-99로 해시하고 해당 버킷이 있는지 확인하십시오. 그렇다면 값을 반환합니다.
이진 검색 트리와 같은 다른 방법으로 사전을 구현할 수도 있습니다 (객체가 비슷한 경우).
다른 실제 응용 프로그램은 두 파일이 동일한 지 확인하는 방법 인 체크섬입니다 (예 : 파일이 이전 버전에서 손상되지 않았 음). 해시 함수는 두 개의 입력을 동일한 출력에 매핑 할 가능성이 거의 없으므로 일반적으로 문자열로 표시되는 첫 번째 파일의 해시를 계산하고 저장합니다. 이 해시는 매우 작으며 수십 개의 ASCII 문자 일 수 있습니다. 그런 다음 두 번째 파일을 받으면 해시하고 출력이 같은지 확인합니다. 그렇다면 거의 확실하게 바이트 단위의 파일과 동일합니다.
다른 응용 프로그램은 암호화에 있으며, 이러한 해시는 "반전"하기 어려워 야합니다. 즉, 출력과 해시 함수가 주어지면 해당 출력으로 이어지는 입력을 파악하기가 계산적으로 어렵습니다. 암호의 용도 중 하나는 암호입니다. 암호 자체를 저장하는 대신 암호의 암호화 해시 (다른 구성 요소와 함께)를 저장합니다. 그런 다음 사용자가 암호를 입력하면 해시를 계산하여 올바른 해시와 일치하는지 확인합니다. 그렇다면 암호가 정확하다고 말합니다. (이제 서버에 저장된 해시를보고 찾을 수있는 사람조차도 사용자 인 것처럼 쉬운 시간이 없습니다.)이 응용 프로그램은 출력이 입력보다 길거나 길 경우에 해당 할 수 있습니다. 입력이 너무 짧습니다.