هل هو Digest MD5 في هذا السيناريو Python؟
سؤال
أحاول أن أفهم رمز Hashlib البسيط هذا في Python الذي أعطيت لي في اليوم الآخر على Stackoverflow:
import hashlib
m = hashlib.md5()
m.update("Nobody inspects")
m.update(" the spammish repetition here")
m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
m.digest_size
16
m.block_size
64
print m
وأعتقد أن print m
سيظهر لي هضم MD5 من العبارة: "لا أحد يتفقد تكرار spammish هنا" ، لكن ونتيجة لذلك ، حصلت على هذا الخط على مضيفتي المحلية:
<md5 HASH object @ 01806220>
غريب ، عندما قمت بتحديث الصفحة ، حصلت على سطر آخر:
<md5 HASH object @ 018062E0>
وفي كل مرة عندما أقوم بتحديثها ، أحصل على قيمة أخرى:
MD5 Hash Object @ 017f8ae0
كائن التجزئة md5 @ 01806220
كائن التجزئة md5 @ 01806360
كائن التجزئة md5 @ 01806400
كائن التجزئة md5 @ 01806220
لماذا هو كذلك؟ أعتقد ، ما لدي في كل سطر يتدفق "@" ليس حقًا هضمًا. ما هي اذا؟ وكيف يمكنني عرض MD5 Digest هنا في هذا الرمز؟
إصدار Python الخاص بي هو Python 2.5 والإطار الذي أستخدمه حاليًا هو WebApp (لقد قمت بتنزيله مع SDK من "Google App Engine")
المحلول
ال hashlib.hash
الكائن لا ينفذه __str__
, ، وبالتالي يتم استخدام عملية السلسلة الافتراضية ، والتي تطبع اسم الفصل يتبعها id
(عنوان).
(يستخدم .hexdigest()
للحصول على سلسلة Hex MD5.)
نصائح أخرى
print m.hexdigest()
Upadate: hexdigest()
يعطي تمثيلًا آخر لـ digest()
. يتم تحويل كل حرف في Digest إلى تمثيل سداسي عشري. يمكنك تحويلها بالوظيفة التالية:
def digest_to_hex(chars):
res = ''
for c in chars:
res = res + '%02x' % ord(c)
return res
يمكنك أيضًا استخدام Expresion المولد
''.join('%02x' % ord(x) for x in m.digest())
أو
m.digest().encode('hex')
راجع للشغل: يمكنك استخدام dir(some_object)
للحصول على قائمة بعناصرها ، و help(some_object)
(في المترجم التفاعلي) للحصول على مزيد من المعلومات حول هذا الموضوع.