อย่างไรก็ตามฉันสามารถแฮชสตริงแบบสุ่มเป็นตัวเลข 8 หลักโดยไม่ต้องใช้อัลกอริทึมใด ๆ ด้วยตัวเองได้หรือไม่?
อย่างไรก็ตามฉันสามารถแฮชสตริงแบบสุ่มเป็นตัวเลข 8 หลักโดยไม่ต้องใช้อัลกอริทึมใด ๆ ด้วยตัวเองได้หรือไม่?
คำตอบ:
ได้คุณสามารถใช้hashlib
โมดูลในตัวหรือhash
ฟังก์ชันในตัว จากนั้นสับเลขแปดหลักสุดท้ายโดยใช้การดำเนินการแบบโมดูโลหรือการตัดสตริงในรูปแบบจำนวนเต็มของแฮช:
>>> 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 (แม้ว่าคุณจะไม่ต้องการ abs () หรือ parens ประมาณ 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.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
ฉันกำลังแบ่งปันการใช้งาน nodejs ของเราในการแก้ปัญหาที่ดำเนินการโดย @Raymond Hettinger
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));