문자열을 8자리 숫자로 해시하는 방법은 무엇입니까?
알고리즘을 직접 구현하지 않고 임의의 문자열을 8자리 숫자로 해시할 수 있는 방법이 있습니까?
네, 빌트인 모듈이나 빌트인 기능을 이용하실 수 있습니다.그런 다음 모듈로 연산 또는 해시의 정수 형식에 대한 문자열 슬라이싱 연산을 사용하여 마지막 8자리를 잘라냅니다.
>>> s = 'she sells sea shells by the sea shore'
>>> # Use hashlib
>>> import hashlib
>>> int(hashlib.sha1(s.encode("utf-8")).hexdigest(), 16) % (10 ** 8)
58097614L
>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974
Raymond의 답변은 python2에 좋습니다(하지만, 복근()이나 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(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
따라서 애플리케이션에서 이 기능이 중요한지 여부에 따라(내 애플리케이션에서 중요한지 여부에 따라) 해시립 기반 접근 방식을 고수하기를 원할 수 있습니다.
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
파이썬 3.10에서 8자리 숫자 다이제스트로 문자열을 해시하는 또 다른 빠른 방법은 셰이크를 사용하는 것입니다.16진수(4):
import hashlib
h=hashlib.shake_128(b"my ascii string").hexdigest(4)
#34c0150b
다이제스트는 매개 변수로 지정된 숫자보다 두 배 더 길기 때문에 8 대신 4를 고려하십시오.
물론 해시 충돌에 유의해야 합니다.
언급URL : https://stackoverflow.com/questions/16008670/how-to-hash-a-string-into-8-digits
'programing' 카테고리의 다른 글
Oracle이 ORDER BY로 인덱스를 무시하는 이유는 무엇입니까? (0) | 2023.06.27 |
---|---|
실제 존재하는 파일을 제거할 수 없습니다. fatal: pathspec ...이(가) 일치하지 않습니다. (0) | 2023.06.27 |
python에서 변수 인수(kwargs)에서 클래스 속성을 설정하는 방법 (0) | 2023.06.27 |
아티팩트 com.oracle:ojdbc6:jar:11.2.0.3 누락 (0) | 2023.06.27 |
MongoDB에서 각 문서의 마지막 업데이트 시간을 검색하는 방법은 무엇입니까? (0) | 2023.06.27 |