해시 알고리즘 예제

이브는 메시지의 의미에 영향을 주지 않는 사소한 편집 변경(예: 공백이나 탭 추가 또는 서식 변경)을 수행하여 무해한 메시지의 232가지 변형을 생성합니다. 해시 테이블과 같은 많은 응용 프로그램에서 충돌은 시스템을 약간 느리게 만들지만 그렇지 않으면 무해합니다. 이러한 시스템에서는 MurmurHash 및 SBoxHash와 같은 곱셈을 기반으로 해시 함수를 사용하거나 CRC32와 같은 더 간단한 해시 함수를 사용하고 더 많은 충돌을 용인하는 것이 좋습니다. 이러한 충돌을 많이 피하지만 계산하는 데 시간이 오래 걸리는 보다 복잡한 해시 함수를 사용하는 대신 곱셈 해싱은 확산 불량으로 이어지는 “일반적인 실수”에 취약하며, 값이 높은 입력 비트는 낮은 값의 출력 비트에 영향을 미치지 않습니다. [13] 보낼 중요한 파일이 있고 한 조각으로 변경없이 주소지정에 도착할 수 있도록 하고 싶다고 가정해 봅시다. 여러 번 보내고, 주소가 지정된 사람과 접촉하고, 파일을 확인하는 등 몇 가지 사소한 방법을 사용할 수 있습니다… 그러나 훨씬 더 나은 접근 방식이 있으며 해싱 알고리즘이라고합니다. 반환되는 것은 이진 해시의 텍스트 육각형 표현입니다. 예를 들어 해시된 암호를 저장하는 데 유용할 수 있지만 해시를 암호화 루틴의 키로 사용하려는 경우 이 텍스트 표현이 아닌 이진 값을 사용하려고 합니다. 난수 표(예: 256개의 임의 32비트 정수)는 해시 함수또는 암호화와 같은 다른 용도로 사용할 고품질의 비선형 함수를 제공할 수 있습니다.

해시할 키는 8비트(1바이트) 부분으로 분할되며 각 부품은 비선형 테이블의 인덱스로 사용됩니다. 그런 다음 테이블 값이 해시 출력 값에 산술 또는 XOR 추가로 추가됩니다. 테이블의 크기는 1024바이트에 불과하기 때문에 최신 마이크로프로세서의 캐시에 적합하며 해싱 알고리즘을 매우 빠르게 실행할 수 있습니다. 테이블 값이 평균 8비트보다 훨씬 길기 때문에 한 비트의 입력이 거의 모든 출력 비트에 영향을 줍니다. 대부분의 경우 일반적인 해시 함수보다 더 적은 충돌을 생성하는 특수 목적(휴리스틱) 해시 함수를 디자인할 수 있습니다. 예를 들어 입력 데이터가 FILE0000과 같은 파일 이름이라고 가정합니다. CHK, FILE0001. CHK, FILE0002. CHK 등, 대부분 순차적 숫자.

이러한 데이터의 경우 파일 이름의 숫자 부분 k를 추출하고 k mod n을 반환하는 함수는 거의 최적입니다. 말할 필요도 없이 특정 종류의 데이터에 매우 좋은 함수는 다른 분포를 가진 데이터에 대한 성능이 저하될 수 있습니다. 해시 테이블에는 종종 유효한 입력의 작은 하위 집합만 포함됩니다. 예를 들어, 클럽 회원 명단에는 가능한 모든 이름의 매우 큰 집합 중100명 정도의 회원 이름만 포함될 수 있습니다. 이러한 경우 균일성 기준은 테이블에서 찾을 수 있는 거의 모든 일반적인 항목 하위 집합에 대해 가능한 모든 항목의 전역 집합뿐만 아니라 유지되어야 합니다. 위의 알고리즘은 i = 1 ~ 64에 대한 집합 o 64 상수 T[i]를 사용합니다. T[i]는 테이블의 i-th 요소를 나타내는데, 이는 4294967296 번 abs(sin(i))의 정수 부분과 동일하며, 여기서 나는 라디안에 있습니다. 테이블의 요소는 RFC 1321의 부록에 제공됩니다. 여기서 가상의 상황을 상상해 봅시다. 다른 사람에게 메시지 /파일을 보내고 싶다면 의도 한 받는 사람에게 정확히 동일한 형식으로 도달하는 것이 절대적으로 필수적이라고 가정합니다. 어떻게 하시겠습니까? 한 가지 옵션은 여러 번 보내고 변조되지 않았는지 확인하는 것입니다. 그러나 메시지가 너무 길면 어떻게해야합니까? 파일이 기가바이트로 측정되면 어떻게 됩니까? 그것은 모든 단일 문자를 확인하는 완전히 터무니없는, 비실용적이고 매우 솔직히 지루한 것, 오른쪽? 글쎄, 해싱이 작용합니다.

해시 함수는 느린 미디어에 저장된 대용량 데이터 집합에 대한 캐시를 빌드하는 데도 사용됩니다.