code

문자열을 8 자리로 해시하는 방법은 무엇입니까?

codestyles 2020. 11. 13. 08:13
반응형

문자열을 8 자리로 해시하는 방법은 무엇입니까?


어쨌든 알고리즘을 직접 구현하지 않고도 임의의 문자열을 8 자리 숫자로 해시 할 수 있습니까?


예, 내장 된 hashlib 모듈 또는 내장 된 해시 함수를 사용할 수 있습니다. 그런 다음 해시의 정수 형식에서 모듈로 연산 또는 문자열 슬라이싱 연산을 사용하여 마지막 8 자리 숫자를 잘라냅니다.

>>> s = 'she sells sea shells by the sea shore'

>>> # Use hashlib
>>> import hashlib
>>> int(hashlib.sha1(s).hexdigest(), 16) % (10 ** 8)
58097614L

>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974

Raymond의 대답은 python2에 적합합니다 (그러나 abs () 또는 10 ** 8 주위의 괄호가 필요하지 않습니다). 그러나 python3의 경우 중요한주의 사항이 있습니다. 먼저 인코딩 된 문자열을 전달하고 있는지 확인해야합니다. 요즘에는 대부분의 상황에서 sha-1을 피하고 대신 sha-256과 같은 것을 사용하는 것이 좋습니다. 따라서 hashlib 접근 방식은 다음과 같습니다.

>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417

대신 hash () 함수를 사용하려는 경우 중요한주의 사항은 Python 2.x와 달리 Python 3.x에서 hash ()의 결과가 Python 호출이 아닌 프로세스 내에서만 일관된다는 것입니다. 여길 봐:

$ python -V
Python 2.7.5
$ python -c 'print(hash("foo"))'
-4177197833195190597
$ python -c 'print(hash("foo"))'
-4177197833195190597

$ python3 -V
Python 3.4.2
$ python3 -c 'print(hash("foo"))'
5790391865899772265
$ python3 -c 'print(hash("foo"))'
-8152690834165248934

이는 제안 된 hash () 기반 솔루션을 의미하며 다음과 같이 단축 할 수 있습니다.

hash(s) % 10**8

주어진 스크립트 실행 내에서만 동일한 값을 반환합니다.

#Python 2:
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543

#Python 3:
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
12954124
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
32065451

따라서 이것이 귀하의 응용 프로그램에서 중요한지 여부에 따라 (내게 그랬습니다) 아마도 hashlib 기반 접근 방식을 고수하고 싶을 것입니다.


JJC 답변을 완료하기 위해 python 3.5.3에서 hashlib를 다음과 같이 사용하면 동작이 정확합니다.

$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded
$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded

$ python3 -V
Python 3.5.3

참고 URL : https://stackoverflow.com/questions/16008670/how-to-hash-a-string-into-8-digits

반응형