---
description: Hash Function 종류 및 원리
---

# Hash Function

복수의 서버들에 대한 부하 분산을 위하여, **서버 부하 분산 장치**는 클라이언트로부터 획득되는 URL(uniform resource locator)에 대하여 해시 소스를 선택하고, 선택된 해시 소스에 대하여 미리 설정된 해시 함수를 적용시킨다.&#x20;

그리고 해시 함수를 적용하여 획득되는 해시 결과를 토대로 하는 해시값에 따라 복수의 서버들 중에서 하나를 선택하고, 선택된 서버로 클라이언트를 연결시킨다.

## **MD5**

* 128비트 [암호화 해시 함수](https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98)이다.
* 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다.
* 하지만 암호화 결함이 발견되어 보안 용도로 사용할때에는 SHA와 같은 다른 알고리즘을 사용하는것이 권장되고 있다고 한다.

#### 원리&#x20;

* MD5는 임의의 길이의 메시지를 입력받아, 128 비트짜리 고정 길이의 출력값을 낸다.&#x20;
* 입력 메시지는 512 비트 블록들로 쪼개진다.
* 메시지를 우선 [패딩](https://ko.wikipedia.org/w/index.php?title=%ED%8C%A8%EB%94%A9_\(%EC%95%94%ED%98%B8%ED%95%99\)\&action=edit\&redlink=1)하여 512로 나누어떨어질 수 있는 길이가 되게 한다.&#x20;
  * 패딩은 다음과 같이 한다.
    * 우선 첫 단일 비트, 1을 메시지 끝부분에 추가한다.&#x20;
    * 512의 배수의 길이보다 64 비트가 적은 곳까지 0으로 채운다.&#x20;
    * 나머지 64 비트는 최초의(오리지널) 메시지의 길이를 나타내는 64 비트 정수(integer)값으로 채워진다.

![](https://1715430459-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LcsheX9TIMwoBSNygvE%2F-LfqqTjdsHmIhtYezk-U%2F-LfqxB6VIu-RfVnfcS1g%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202019-05-27%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.42.48.png?alt=media\&token=38c23e02-af7f-4c27-995b-780c155438ef)

#### Python3 로 MD5 Hash 구현하기

MD5 hash를 얻기 위한 메소드, getHash 를 만들어야 합니다.

```
def getHash(path, blocksize=65536):
    afile = open(path, 'rb')
    hasher = hashlib.md5()
    buf = afile.read(blocksize)
    while len(buf) > 0:
        hasher.update(buf)
        buf = afile.read(blocksize)
    afile.close()
    return hasher.hexdigest()
```

#### 실제 사용 예시

* 크롤링을 할때, 파일 경로의 중복을 막기 위해 사용&#x20;

## &#x20;Modular

* 탐색 Key 를 Hash Table 의 크기로 나누어서 그 나머지를 Hash Table 의 주소로 하는 것.
* 정수를 Hash Table 크기 M 으로 나누어서 나머지를 취하면 0 \~ M-1 까지의 숫자가 생성된다.
* 장점: 삽입/삭제 : O(1) , 탐색 O(l)
* 단점: 충돌 일어남. -> 체이닝 등으로 해결해야

## **SHA-256 (Sechre Hash Standard)**&#x20;

MD5와 뭐 거의 동일하지만 **160bit** 의 해쉬를 제공한다. SHA는 256 뿐만아니라, SHA-0, SHA-1 과 같이 여러 암호학적 해쉬가 존재한다.

## SHA1

* SHA-1은 이전에 널리 사용되던 [MD5](https://ko.wikipedia.org/wiki/MD5)를 대신해서 쓰이기도 한다. 혹자는 좀 더 중요한 기술에는 SHA-256이나 그 이상의 알고리즘을 사용할 것을 권장한다.

#### SHA-1 해시값 예제

```
SHA1("The quick brown fox jumps over the lazy dog")
  = 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
```

파이썬 hashlib 패키지의 sha1은 리눅스의 sha1sum 혹은 shasum 프로그램이 제공하는 160 비트 (20 바이트) SHA1 hash(해시)를 만들 수 있는 기능을 제공합니다.

사용 용도는 다운로드 받은 파일이 깨지지 않고 제대로 받았는지 압축 파일 .zip과 함께 해시 값이 들어 있는 .sha 파일을 같이 다운로드 한 다음에 .zip 파일의 SHA1 해시 값을 구하고 .sha 파일에 들어 있는 해시 값과 비교하여 같지 않으면 잘 못된 파일을 다운로드 받은 것으로 판단 용으로 사용합니다. 즉 원본 파일과 같은 파일인지의 판단에 해시 값이 사용됩니다.

sha1.update 함수를 이용하여 일정 블록 크기로 파일일 읽어 들이고 읽어 들인 데이터로 SHA1 해시 값을 계산하고, 마지막에 16 진수 문자열의 해시 값을 얻기 위하여 sha1.hexdigest 함수를 사용하였습니다.

{% embed url="https://m.blog.naver.com/PostView.nhn?blogId=msyang59&logNo=220649763645&proxyReferer=https%3A%2F%2Fwww.google.com%2F" %}

{% embed url="https://psychoria.tistory.com/232" %}





\-----------------------\
출처: [https://ra2kstar.tistory.com/142](https://ra2kstar.tistory.com/142) \[초보개발자 이야기.]

출처 : [https://patents.google.com/patent/WO2013094837A1/ko](https://patents.google.com/patent/WO2013094837A1/ko)
