티스토리 뷰

Python hashlib로 sha256인코딩한 hex값 만들기

Hash는 암호화된 값입니다.

0 1 2 3 4 5
           

위와 같이 값을 배열에 저장 하려면 arr[0] = 'hello' 이렇게 저장을 하면 되지만

0 1 2 3 4 5
hello          

저장된 값에 접근을 하려면 반드시 index를 알아야 합니다. index를 모른다면 배열을 0번부터 원하는 값이 나올때까지 모두 검색을 해야 합니다.

그래서 배열 번호로 접근 하는 것이 아니라 key로 데이터에 접근을 하기 위해 Hash를 사용하는데 Hash를 사용하는 맵은 HashMap이라고 합니다.

Hash는 Hash를 만들어주는 함수가 있고 그 함수가 return하는 값은 배열의 번호 입니다. 예를들어 'aa'라는 key를 make_hash(char) 라는 함수를 이용해 hash로 만들었다면 0이라는 값을 return 해주고 map['aa'] 이렇게 검색하면 'hello'를 찾을 수 있습니다.

Hash를 만드는 함수는 여러가지가 존재 합니다. hashlib문서를 보면 SHA1, SHA224, SHA256, SHA384, SHA512 이러한 function들이 들어있다고 합니다. 또한 hash함수는 직접 만들 수도 있습니다.

def _get_hash(self, key):
    hash = 0
    for char in key:
        hash += ord(char)
    return hash % 100

위 코드는 나머지를 이용해 hash를 만드는 코드 입니다.

 

해시 충돌 문제

위 코드의 원리는 문자를 ascii코드로 변환하는 것 입니다. k는 아스키코드에서는 107번째에 있고 j는 아스키코드에서 106번째에 있습니다.

def name_hash(s):
    print(ord(s))

if __name__ == '__main__':
    name_hash('k')
    name_hash('j')

결과

107
106

 

그러면 같은 글자가 들어간다면 같은 값이 나온다는 것입니다. 예를 들어 kj와 jk는 같은 결과가 리턴이 됩니다.

def name_hash(s):
    ascii_sum = 0
    for c in s:
        ascii_sum += ord(c)
    return ascii_sum

if __name__ == '__main__':
    print(name_hash('kj'))
    print(name_hash('jk'))

결과

213

213

 

해시 충돌(Hash Collision) 해결 방법

해시 충돌을 해결하는 방법은 오픈 어드레싱 방식과 체이닝 방식이 있습니다.

오픈 어드레싱 방식은 데이터를 저장하려고 할 때 이미 그 자리(버킷)에 데이터가 있을 경우 다른 빈 자리에 저장하는 방식이고 체이닝 방식은 한 자리에 중복되는 여러개의 데이터를 저장하는 방식 입니다.

 

체이닝 방식

class HashTable:
    size = 10
    table = [[] for _ in range(size)]

    def name_hash(self, s):
        ascii_sum = 0
        for c in s:
            ascii_sum += ord(c)
        return ascii_sum % self.size

    def insert(self, key, value):
        idx = self.name_hash(key)
        self.table[idx].append({'key':key, 'value':value})

    def find(self, key):
        idx = self.name_hash(key)
        if len(self.table[idx]) == 1:
            return self.table[idx][0]['value']
        else:
            for item in self.table[idx]:
                if item['key'] == key:
                    return item['value']

    def print_table(self):
        print(self.table)



if __name__ == '__main__':
    ht = HashTable()
    ht.insert('jisoo', 11)
    ht.insert('sooji', 12)
    ht.print_table()

 

결과


[[], [], [], [], [], [], [], [], [{'key': 'jisoo', 'value': 11}, {'key': 'sooji', 'value': 12}], []]
12

 

 

sha256함수를 이용하는 방법

여러가지 hash함수 중에서 아래 코드는 sha256함수를 이용하는 코드 입니다.

import hashlib

string = 'a'
encoded_string = string.encode()
print(encoded_string)
hexdigest = hashlib.sha256(encoded_string).hexdigest()
print('a:', hexdigest)

string2 = 'a.'
encoded_string2 = string2.encode()
print('a.:', hashlib.sha256(encoded_string2).hexdigest())

결과

b'a'

a: ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb

a.: 5ab640fad553cbf927dc96b8e7878a9844b2fa79b7a4f5c515e186970ec53027

블록체인의 블록을 암호화 하는 기법이 sha256입니다.

소스코드 설명을 해보면 일단은 import hashlib해주어야 합니다.

그리고 sha256으로 암호화 시키려면 .encode() 해주어야 합니다다.

인코딩을 하지 않으면 에러가 나기 때문에 에러가 난다면 꼭 인코딩을 해주세요.

그래서 a라는 글자를 sha256으로 암호화를 하면 ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb 이게 됩니다. 여러분들도 위 코드를 돌려 보시면 같은 결과가 나올 것입니다. 64글자나 됩니다.

여기에 점을 하나 찍으면 a.인데 이걸 sha256으로 암호화 하면 5ab640fad553cbf927dc96b8e7878a9844b2fa79b7a4f5c515e186970ec53027 이렇게 됩니다. 전혀 다른 값이 나옵니다. 그래서 이 방법이 암호화 방법으로 널리 사용되고 있습니다.

end.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함