“해시”란 정확히 무엇입니까?


38

나는 "해시"라는 단어가 다른 의미 (다른 모든 컴퓨팅 환경 내)에서 다른 의미로 사용되는 것을 들었습니다. 예를 들어, 『Python the Hard Way』책 에서 사전대한 장에서 "Python은"dicts "라고합니다. 다른 언어에서는"hashs "라고합니다. 해시 사전입니까?

단어의 다른 일반적인 사용법은 암호화와 관련이 있습니다. 또한 높은 수준의 프로그래밍에서 "해시"라는 단어를 특정 기능으로 사용하는 사람들도 들었습니다.

정확히 무엇입니까?

누구든지 (시간이 있고 지식이있는 사람) "해시 (또는 해시)"의 장점을 친절하게 설명 할 수 있습니까?


8
Wikipedia에는 해시 테이블암호화 해시 함수 에 대한 자세한 기사가 있습니다 . 저것에없는 것을 찾고 있습니까?
David Richerby

1
이미 "해시"라는 용어를 여러 번 사용했으며 그 이상이 있습니다. "정확히 무엇입니까?"에 대한 답변을 정확히 어떻게 얻을 것으로 기대하십니까?
Raphael

4
이런 의미에서 "해시"는 "해시 테이블"의 단축입니다 (예 : 키 구성에 해시를 사용하는 테이블). 휘발유를 "가스"라고 부르는 것과 비슷합니다. "가스"가 휘발유가 될 것이라고 생각하지 않거나 휘발유와 같은 성질을 가진 가스를 기대하지 않습니까? 이것은 언어에서 항상 발생합니다. 특히 단축은 매우 일반적인 단어 오버랩의 원천입니다.
Luaan

1
"이 단어에 대한 정의는 없습니다. 아무도 해시가 무엇인지 모릅니다." - 악마의 사전
jpmc26

해시 함수가 무엇인지 생각하는 여러 가지 훈련을 다시 해시하십시오. 해시 함수는 많은 속성을 가진 일부 함수이지만 관련성이 정의 된 방식이 아니며 원하는 속성이 있습니다. 우리가 원하는 방식에서 파생됩니다. 기능을 사용하려면 관련이 있습니다. 우리는 그것을 사용하여 물건에 빠르게 액세스하기를 원하기 때문에 효율적으로 계산할 수 있기를 원합니다. 사용 가능한 무한 공간이 없기 때문에 공동 도메인을 유한하게 만들고 싶습니다. 우리는 가능한 한 충돌을 피하기 위해 해시 함수가 해시를 균등하게 분산시키기를 원합니다.
G. Bach

답변:


44

해시 함수 에 관한 Wikipedia 기사 는 매우 훌륭하지만 여기서는 제가 설명하겠습니다.


해시는 무엇입니까?

"해시"는 실제로 다른 상황에서 다른 공식적인 의미를 가진 광범위한 용어입니다. 귀하의 질문에 대한 완벽한 대답은 없습니다. 나는 일반적인 기본 개념을 설명하고이 용어의 가장 일반적인 사용법을 언급 할 것입니다.

"해시"는 입력 객체로 취해 문자열 또는 숫자를 출력하는 해시 함수 라고 하는 함수 입니다. 입력 객체는 일반적으로 문자열, 정수 또는 사용자 정의 구조와 같은 다른 객체로 구성된 더 큰 것과 같은 기본 데이터 유형의 멤버입니다. 출력은 일반적으로 숫자 또는 문자열입니다. 명사 "해시"는 종종이 출력을 나타냅니다. 동사 "해시"는 종종 "해시 함수 적용"을 의미합니다. 해시 함수의 주요 속성은 다음과 같습니다.h

  1. 계산하기 쉽고
  2. 출력은 상대적으로 작아야합니다.

예:

0에서 999,999,999 사이의 숫자를 0에서 99 사이의 숫자로 해시한다고 가정합니다. 간단한 해시 함수는 있습니다.h(x)=xmod100

일반적인 추가 속성 :

유스 케이스에 따라 해시 함수가 추가 특성을 만족 시키길 원할 수 있습니다. 일반적인 추가 속성은 다음과 같습니다.

  1. 균일 성 : 종종 우리는 객체의 해시를 구별하기를 원합니다. 또한 우리는 해시가 "확산"되기를 원할 수 있습니다. 일부 객체를 100 버킷으로 해시하려면 (해시 함수의 출력은 0-99의 숫자입니다) 일반적으로 약 1/100 객체가 버킷 0에, 약 1/100 랜드에 도달하기를 희망합니다 버킷 1 등.

  2. 암호화 충돌 저항 : 때때로 이것은 예를 들어 암호화에서 더 멀리 가져옵니다. 해적 함수가 원수가 동일한 출력에 매핑되는 두 개의 다른 입력을 찾기가 어려울 수 있도록 해시 함수를 원할 수 있습니다.

  3. 압축 : 종종 임의의 큰 입력을 일정한 크기의 출력 또는 고정 된 수의 버킷으로 해시하고 싶습니다.

  4. 결정 : 실행 사이에 출력이 변경되지 않는 해시 함수를 원할 수 있습니다. 즉 동일한 객체에서 해시 함수의 출력은 항상 동일하게 유지됩니다. 이것은 위의 균일 성과 충돌하는 것처럼 보일 수 있지만 한 가지 해결책은 해시 함수를 무작위로 한 번 선택하고 실행간에 변경하지 않는 것입니다.


일부 응용

일반적인 응용 프로그램 중 하나는 사전을 구현하는 방법 인 해시 테이블과 같은 데이터 구조에 있습니다. 여기에 100 개의 "버킷"과 같은 메모리를 할당합니다. 그런 다음 사전에 (키, 값) 쌍을 저장하라는 메시지가 표시되면 키를 0-99로 해시하고 해당 버킷의 쌍을 메모리의 해당 버킷에 저장합니다. 그런 다음 키를 조회하라는 메시지가 표시되면 동일한 해시 함수를 사용하여 키를 숫자 0-99로 해시하고 해당 버킷이 있는지 확인하십시오. 그렇다면 값을 반환합니다.

이진 검색 트리와 같은 다른 방법으로 사전을 구현할 수도 있습니다 (객체가 비슷한 경우).

다른 실제 응용 프로그램은 두 파일이 동일한 지 확인하는 방법 인 체크섬입니다 (예 : 파일이 이전 버전에서 손상되지 않았 음). 해시 함수는 두 개의 입력을 동일한 출력에 매핑 할 가능성이 거의 없으므로 일반적으로 문자열로 표시되는 첫 번째 파일의 해시를 계산하고 저장합니다. 이 해시는 매우 작으며 수십 개의 ASCII 문자 일 수 있습니다. 그런 다음 두 번째 파일을 받으면 해시하고 출력이 같은지 확인합니다. 그렇다면 거의 확실하게 바이트 단위의 파일과 동일합니다.

다른 응용 프로그램은 암호화에 있으며, 이러한 해시는 "반전"하기 어려워 야합니다. 즉, 출력과 해시 함수가 주어지면 해당 출력으로 이어지는 입력을 파악하기가 계산적으로 어렵습니다. 암호의 용도 중 하나는 암호입니다. 암호 자체를 저장하는 대신 암호의 암호화 해시 (다른 구성 요소와 함께)를 저장합니다. 그런 다음 사용자가 암호를 입력하면 해시를 계산하여 올바른 해시와 일치하는지 확인합니다. 그렇다면 암호가 정확하다고 말합니다. (이제 서버에 저장된 해시를보고 찾을 수있는 사람조차도 사용자 인 것처럼 쉬운 시간이 없습니다.)이 응용 프로그램은 출력이 입력보다 길거나 길 경우에 해당 할 수 있습니다. 입력이 너무 짧습니다.


1
좋은 설명이지만 "매우 드물다"에 동의하지 않습니다. 다음을 참조하십시오 : programmers.stackexchange.com/questions/49550/… : 충돌 발생하며 때로는 놀랍게도 자주 발생합니다.
Olivier Dulac

8
또한 암호화의 맥락에서 "해시"라는 용어는 실제로 쉽게 되돌릴 수없는 "단방향"작업을 의미합니다. 쉽게 되돌릴 수 있으면이를 "암호화"라고합니다. 이것이 바로 Security.SE 직원들이 고객의 암호를 항상 해시하고 암호화하지 말라고 알려주는 이유입니다.
Ixrec

4
"확산되지 않은"해시는 여전히 해시이며 아마도 응용 프로그램에 적합하지 않을 수도 있습니다.
그만해라 모니카

1
물론, 이것들은 모두 좋은 지적입니다.
usul

10

해시 함수는 입력을 취하여 고정 된 크기 값을 생성하는 함수이다. 예를 들어 길이 stringHash를 수용 string하고 32 비트 정수를 생성하는 해시 함수 가 있을 수 있습니다 .

전형적으로는 (A)의 출력 말할 올바른 해쉬 함수 A는 해시 (해시 값 또는 해시 합이라고 끄트머리). 그러나 때때로 사람들은 함수 자체를 해시 로 참조합니다 . 이것은 기술적으로 부정확하지만 일반적으로 사람이 해시 함수를 의미한다고 일반적으로 이해하기 때문에 간과됩니다 .

해시 함수 의 일반적인 사용법은 해시 테이블 을 구현하는 것 입니다. 해시 테이블은 값을 일반적으로 키라고하는 다른 값과 연결하는 데이터 구조입니다. 키에 해시 함수를 사용하여 저장된 데이터를 빠르게 조회하는 데 사용할 수있는 고정 크기의 해시 값을 생성합니다. 그 방법에 대해서는 자세히 설명하지 않겠지 만 여기서 중요한 사실 은 해시 함수 를 사용하여 해시 값 (해시) 을 생성 하기 때문에 해시 테이블 이라고합니다 .

일부 사람들은 (다소 부정확하게) 해시 테이블해시로 참조하기 때문에 혼란이 발생 합니다 . 다른 답변에 명시된 바와 같이, 때로는 주어진 언어의 구현 해시 테이블이 받는 의미 해시 테이블 A와 해시 (I 다른 언어뿐만 아니라 할 것으로 예상하지만, 특히 펄,이 작업을 수행). 다른 언어는 해시 테이블 의 구현을 사전 으로 참조하도록 선택합니다 . 파이썬은 이러한 언어 중 하나이지만, 언어에 깊이 뿌리 내려서 많은 파이썬 사용자는 사전이라는 용어를 'dict'로 단축합니다.

따라서 해시 라는 용어의 올바른 사용은 해시 함수에 의해 생성 된 해시 값 을 참조 하는 것이지만 사람들은 때때로 해시 함수해시 테이블 을 지칭하기 위해 비공식적으로이 용어를 사용 하여 혼동을 만듭니다.


2
해시 테이블 또는 해시 함수를 "해시"(예 : "워싱턴"을 사용하여 "미국"을 의미하는 것보다 "나쁜"것으로 간주하는 것이 실제로 부 정확한지 확실 하지 않습니다. 워싱턴은 신중하게 중국의 성명을 환영했다 "). 그러나 나는 그것이 혼란스럽고 귀하의 답변에서 그것에 대해 명확하게 이해하는 것이 좋습니다.
David Richerby

1
@DavidRicherby 공식적으로 작업 "해시"는 정의되어 있지 않습니다. "해시 함수", "해시 값", "해시 테이블"및 "문자열 해시"는 모두 정확한 수학적 정의를 갖지만 "해시"는 모호합니다. 마찬가지로 "워싱턴"이라는 말의 의미를 알고 있지만 "워싱턴"을 "워싱턴시"가 아닌 "조지 워싱턴"또는 "덴젤 워싱턴"으로 해석하면 문장이 의미가 있습니다. 연방 정부를 지칭합니다. 결론 : 엄격한 공식 정의에 대해 "무엇을 의미하는지 알고"혼동하지 않도록주의하십시오.
Mike Ounsworth

@DavidRicherby 그것은 실제로 동등한 비유가 아닙니다. 부정확성은 논란의 여지가 있지만 비공식 성은 아닙니다.
Pharap

2

해시 함수는 이미지가 도메인 보다 작은 모든 함수 입니다. 이러한 함수의 출력을 f(x)"해시 x"라고합니다.

컴퓨터 과학에서 우리는 일반적으로 두 가지 해시 함수 적용을 경험합니다.

첫 번째는 해시 테이블 과 같은 데이터 구조를위한 것으로 키 도메인 (예 : 32 비트 정수 또는 임의 길이의 문자열)을 배열 인덱스 (예 : 0에서 100 사이의 정수)에 매핑하려고합니다. 여기서 목표는 데이터 구조의 성능을 최대화하는 것입니다. 일반적으로 바람직한 해시 함수의 속성은 단순하고 균일 한 출력 분포입니다.

펄은 내장 연관 배열 타입을 "hash"라고 부른다 . 이것은 혼동을 일으키는 원인으로 보인다. 나는 이것을하는 다른 언어를 모른다. 데이터 구조는 해시 함수 자체 (도메인이 현재 키 세트 임)로 볼 수 있지만 해시 테이블로도 구현됩니다.

두 번째는 암호화 를위한 것 입니다 : 메시지 인증, 암호 / 서명 확인 등. 도메인은 일반적으로 임의의 바이트 문자열입니다. 여기서 우리는 유용한 속성이 충돌 및 사전 이미지 저항 인 보안-때로는 고의로 낮은 성능을 의미 함-에 관심이 있습니다.


SHA-512로 32 문자 암호를 해시 할 때 입력 공간이 실제로 출력 공간보다 작기 때문에 여전히 첫 번째 문장에 반대합니다. 해시 함수를 함께 연결할 때 도메인과 범위는 동일합니다. 입력 공간의 크기는 관련이 없습니다. Pharap의 대답은 "해시 함수는 고정 길이 출력을 가진 함수입니다"라는 올바른 정의를 가지고 있습니다. 그게 다야, 그것이 당신이 필요로하는 모든 것입니다. 당신이 말하는 다른 모든 조건은 그로부터 암시됩니다.
Mike Ounsworth

@MikeOunsworth이지만 SHA-512의 도메인은 임의 길이의 이진 문자열입니다. 나는 Pharaps 문구를 훔칠 수 있다고 생각하지만 OP의 이익을 위해 조건을 명시 적으로 만들려고했습니다. 실제로 "고정 길이"가 필요한지 확실하지 않으며 확실하게 정의되어 있지 않습니다.
그만해라 모니카

@OrangeDog Ok, MikesHash()길이가 12 인 문자열을 받아 SHA-512에 전달하고 출력을 반환 하는 함수 안에 SHA-512를 래핑 할 수 있습니다 . 나는 MikesHash()여전히 해시 함수의 정의를 충족 한다고 확신합니다 . (실제로 당신이 옳습니다, 우리가 사용하는 해시 함수는 임의의 길이의 입력을 받아들이지 만, 그렇지 않으면 해시 함수가 아닌 것으로 생각하지 않습니다.)
Mike Ounsworth

@MikeOunsworth는 msb가 1이면 출력이 잘 리거나 채워지도록 줄 바꿈 할 수 있습니다. 출력은 더 이상 고정 길이가 아니지만 여전히 해시 함수입니까?
그만해라 모니카

@OrangeDog 아니오라고 말할 것입니다. 내 요점은 해시 함수가 고정 크기 출력에 매핑되어야하지만 입력 크기는 관련이 없다는 것입니다. 우리는 주제와 거리가 멀었습니다. 귀하의 답변에 좋은 점이 있습니다. 공식적인 정의에주의하십시오 ;-)
Mike Ounsworth

0

좋은 질문 Basil Ajith,

오늘 내가 해보고있는 것에 대한 해시가 무엇인지에 대한 나의 관점은 다음과 같습니다.

*

체크섬을 사용하여 tarball이 다운로드 페이지와 일치하는지 확인하십시오.

*

여기에 이미지 설명을 입력하십시오 감사 자 모자를 쓰고 마법사 가운을 의미합니다

해시는 값 / 문자열 / 무엇 / 라벨인지는 컴퓨터에서 다운로드 소스와 동일해야합니다.


3
이것은 해시를 한 번만 사용합니다. 다른 많은 용도가 있습니다.
Yuval Filmus

사이트에 오신 것을 환영합니다! 체크섬으로 암호화 해시를 사용하는 것은 이미 허용 된 답변에 포함되어 있으므로 많은 화면 공간을 차지하면서 답변에 새로운 내용이 추가되지 않습니다.
David Richerby

-1

다른 사람들의 말을 간단히 요약 해 보겠습니다.

해시 기능

해시 함수라는 특수한 종류의 함수가 있습니다.

"SHA256은 암호화로 안전한 잘 알려진 해시 함수입니다."

세 가지 주요 응용 프로그램은 해시 테이블, * 체크섬 (예 : 하드 드라이브 또는 ADSL 프로토콜의 데이터 무결성 검사) 및 * (암호화 (디지털 서명 및 보안 암호 저장소를 포함하지만 이에 국한되지 않음)의 다양한 형태의 암호화 인증)입니다.

해시 테이블

해시 테이블은 빠른 검색을위한 데이터 구조입니다. 내부적으로 해시 함수를 사용하므로 이름이 사용됩니다.

"데이터베이스는 내부적으로 해시 테이블과 검색 트리를 사용하여 검색 요청 실행 속도를 높입니다."

해시시

  1. 사전 추상 데이터 유형

"해시"는 Perl에 내장 된 사전의 공식 이름입니다. 내부적으로 해시 테이블이므로 이름입니다. "이 서브 루틴은 해시를 첫 번째 인수로 받아들입니다". 요즘은 해시 테이블 일 필요는 없으며 모든 연관 배열에 사용할 수 있습니다.

  1. 일부 입력에 해시 함수를 적용한 결과

".iso 이미지의 MD5 해시는 다운로드 후 무결성을 검사하기 위해 제공됩니다."

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.