어쨌든 알고리즘을 직접 구현하지 않고 임의의 문자열을 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 기반 접근 방식을 고수하고 싶을 것입니다.
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]마녀 를 사용할 수도 있습니다. 여전히 충돌이 발생합니다
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
@Raymond Hettinger가 구현 한 솔루션의 nodejs 구현을 공유하고 있습니다.
var crypto = require('crypto');
var s = 'she sells sea shells by the sea shore';
console.log(BigInt('0x' + crypto.createHash('sha1').update(s).digest('hex'))%(10n ** 8n));