سؤال

أحاول أن أفهم رمز 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) (في المترجم التفاعلي) للحصول على مزيد من المعلومات حول هذا الموضوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top