Hash
개념
- 파일의 모든 바이트를 입력으로 받아 고정 길이의 문자열(예: 32자리)로 변환한 결과.
- 대표적인 알고리즘: MD5, SHA-1, SHA-256
어원
1650s, “to hack, chop into small pieces,” from French hacher “chop up”
1650년대, “작은 조각으로 마구 자르고 다지다”라는 뜻을 가진 프랑스어 “hacher” 에서 유래했다.

Hash browns (1926) is short for hashed browned potatoes
Hash browns (1926년)은 hashed browned potatoes의 약어
용도
- 핵심 용도는 비교와 검증
(1) 동일성 확인
- 파일이 완전히 같은지
- 다운로드 파일이 변조되지 않았는지
(2) 빠른 검색
- 대량 데이터에서 O(1)에 가까운 탐색
- 딕셔너리, 해시 테이블의 핵심 구조
(3) 무결성 검증
- 전송 중 데이터 손상 여부 확인
- 백업·동기화·중복 제거
(4) 보안
- 비밀번호 저장 (원문 저장 대신)
- 전자서명, 블록체인
해시 충돌
개념
- Hash Collision
- 두 개 이상의 서로 다른 파일들이나 데이터들의 해시값이 같은 경우
비둘기집 원리

- n+1개의 물건을 n개의 상자에 넣을 때 적어도 한 상자에는 두 개 이상의 물건이 들어간다는 원리
n개의 비둘기집과 n+1마리의 비둘기가 있다고 가정한다.
만약 각 비둘기집에 한 마리 이하의 비둘기만 들어 있다면, 전체 비둘기집에는 많아야 n마리의 비둘기가 존재한다.
하지만 비둘기는 모두 n+1마리이므로 모순이 발생한다.
따라서 어느 비둘기집에는 두 마리 이상의 비둘기가 존재한다.
파이썬에서 해시 다루기
hashlib
- 파이썬에서는 표준 라이브러리
hashlib만으로도 해시를 계산·비교·관리할 수 있습니다.
문자열 해시
1
2
3
4
5
6
7
8
9
10
11
import hashlib
text = "hello world!"
data = text.encode("utf-8") # 문자열을 바이트로 변환하는 과정 (필수! hashlib 은 바이트만 해싱 가능)
algorithms = ["md5", "sha1", "sha224", "sha256", "sha384", "sha512",
"sha3-224", "sha3-256", "sha3-384", "sha3-512", "blake2b", "blake2s"]
md5 = hashlib.new(algorithms[0]) # 해시 계산기
md5.update(data) # 이전까지 받았던 데이터 + 지금 파라미터로 받은 데이터를 이어 붙여서 해시 계산
hash = md5.hexdigest() # 사람이 읽을 수 있는 16진수로 변환
print(hash)
1
fc3ff98e8c6a0d3087d515c0473f8677
숫자 해시
- 문자열로 변환 후 해싱
1
2
3
4
5
6
7
8
9
10
11
import hashlib
num = 1
data = str(num).encode("utf-8")
algorithms = ["md5", "sha1", "sha224", "sha256", "sha384", "sha512",
"sha3-224", "sha3-256", "sha3-384", "sha3-512", "blake2b", "blake2s"]
md5 = hashlib.new(algorithms[0]) # 해시 계산기
md5.update(data) # 이전까지 받았던 데이터 + 지금 파라미터로 받은 데이터를 이어 붙여서 해시 계산
hash = md5.hexdigest() # 사람이 읽을 수 있는 16진수로 변환
print(hash)
1
c4ca4238a0b923820dcc509a6f75849b
이미지 해시

- 위의 사과 이미지를 해싱해보겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib
img_path = "data/img/20260106_001_003.png"
algorithms = ["md5", "sha1", "sha224", "sha256", "sha384", "sha512",
"sha3-224", "sha3-256", "sha3-384", "sha3-512", "blake2b", "blake2s"]
md5 = hashlib.new(algorithms[0]) # 해시 계산기
chunk_size = 8192
with open(img_path, "rb") as f:
for chunk in iter(lambda: f.read(chunk_size), b""):
md5.update(chunk)
hash = md5.hexdigest()
print(hash)
1
e844fdffea8ec36b91fc9e49f2b7d591
Reference
https://www.etymonline.com/search?q=hash
[https://ko.wikipedia.org/wiki/%EB%B9%84%EB%91%98%EA%B8%B0%EC%A7%91%EC%9B%90%EB%A6%AC](https://ko.wikipedia.org/wiki/%EB%B9%84%EB%91%98%EA%B8%B0%EC%A7%91%EC%9B%90%EB%A6%AC)
Comments