วิธีรับผลรวม MD5 ของสตริงโดยใช้ไพ ธ อน?


262

ในเอกสาร Flickr APIคุณต้องค้นหาผลรวม MD5 ของสตริงเพื่อสร้าง[api_sig]ค่า

เราจะไปสร้าง MD5 ผลรวมจากสตริงได้อย่างไร

ตัวอย่างของ Flickr:

สตริง: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

ผลรวม MD5: a02506b31c1cd46c2e0b6380fb94eb3d

คำตอบ:


252

สำหรับ Python 2.x ให้ใช้pashon hashlib

import hashlib
m = hashlib.md5()
m.update("000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite")
print m.hexdigest()

เอาท์พุท: a02506b31c1cd46c2e0b6380fb94eb3d


77
อย่าพยายามที่จะใช้hashlib.md5().update('your string').hexdigest()มันจะไม่ทำงานตั้งแต่update()คืนไม่มี หากคุณต้องการโซลูชันเดียวให้ใช้คำตอบของ Mark Longair
Christopher Manning

@ChristopherManning m.hexdigest () ส่งคืนการแยกย่อยแบบยาว 32 อักขระ วิธีการแยกย่อยแบบยาว 16 ตัวอักษร?
Adil Malik

@ Darwesh เป็น 32 ตัวอักษรเพราะมันเป็นเลขฐานสิบหกทำm.digest_sizeด้านบนของรหัสนี้ย่อยภายในมีอยู่แล้ว 16 ไบต์
Baris Demiray

1
@ Darwesh คุณสามารถแบ่งสตริงm.hexdigest()[:16]
fedterzi

@Darwesh ตามRFC 1321 md5 จะเป็น 16 ไบต์เสมอ หากคุณต้องการให้มีการแยกย่อยแบบยาว 16 อักขระคุณสามารถทำชิ้นตามที่ Baris Demiray กล่าว
ryan

569

คุณสามารถทำสิ่งต่อไปนี้:

Python 2.x

import hashlib
print hashlib.md5("whatever your string is").hexdigest()

Python 3.x

import hashlib
print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest())

อย่างไรก็ตามในกรณีนี้คุณควรใช้โมดูล Python ที่มีประโยชน์นี้เพื่อการโต้ตอบกับ Flickr API:

... ซึ่งจะจัดการกับการตรวจสอบสำหรับคุณ

เอกสารอย่างเป็นทางการของhashlib


ฉันเห็น API ฉันแค่อยากรู้ว่าฉันจะทำมันได้อย่างไร ขอบคุณ!
super9

1
hexdigest () ส่งคืนการแยกย่อยแบบยาว 32 อักขระ วิธีการแยกย่อยแบบยาว 16 ตัวอักษร?
Adil Malik

2
คำตอบที่ดี! ฉันขอถามได้ไหมว่าเพราะอะไรใน Python 2 เราไม่จำเป็นต้องทำการเข้ารหัส utf-8 แต่ใน Python 3 เราจำเป็นต้องทำการเข้ารหัส ขอบคุณ @ Mark Longair
Jeff Hu

3
@JeffHu เนื่องจากhashlib.md5คาดว่าวัตถุคล้ายไบต์
MaxU

1
ควรใช้เวอร์ชัน Python 3 ใน Python 2 เช่นกัน @JeffHu กำลังขยายตัวในสิ่งที่ @MaxU กล่าวไว้ฟังก์ชั่น md5 นั้นใช้การทดสอบย่อยและไม่ยอมรับ Unicode Python 3 เป็นเข้มงวด / ชัดเจนและถูกต้องดังนั้น str ( "") จึงเป็นยูนิโค้ดและต้องเข้ารหัสเป็น bytestring สตริงใน python2 สามารถตีความได้ว่าเป็นสตริง btyestring หรือ unicode และการส่งผ่าน""สตริงstr ( ) จะถูกตีความว่าเป็น bytestring ถ้าสตริงมีอักขระ Unicode สิ่งนี้จะเพิ่มข้อยกเว้น การเข้ารหัส bytestring จะทำให้ตัวอักษร ASCII ไม่ถูกแตะต้องและแปลงยูนิโค้ดอย่างถูกต้อง
Charles L.

11

คุณได้ลองใช้การใช้ MD5 ในhashlibหรือไม่? โปรดทราบว่าอัลกอริทึมการแฮชจะทำหน้าที่กับข้อมูลไบนารีมากกว่าข้อมูลตัวอักษรดังนั้นคุณอาจต้องระวังเกี่ยวกับการเข้ารหัสอักขระที่ใช้ในการแปลงจากข้อความเป็นข้อมูลไบนารีก่อนการแฮช

ผลของกัญชายังเป็นข้อมูลไบนารี - ดูเหมือนว่าตัวอย่างเช่น Flickr ได้รับแล้วแปลงเป็นข้อความโดยใช้การเข้ารหัสฐานสิบหก ใช้hexdigestฟังก์ชั่นใน hashlib เพื่อรับสิ่งนี้


hexdigest () ส่งคืนการแยกย่อยแบบยาว 32 อักขระ วิธีการแยกย่อยแบบยาว 16 ตัวอักษร?
Adil Malik

1
@Darwesh: ใช่ MD5 เป็น 128 บิตซึ่งเป็น 32 อักขระในฐานสิบหก หากคุณต้องการไดเจสต์ย่อยที่เล็กลงคุณจะต้องมีไดเจสต์ 64 บิต นั่นจะอ่อนแอแม้ว่า ...
Jon Skeet



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.