преобразовать строку в MD5

Ok Я пытаюсь написать базовый конвертер строки в md5 хэш-код, но когда я запускаю мою программу, я получаю ошибку, что говорит:

Traceback (most recent call last):
  File "C:UsersShaneDocumentsAmer CISClab4.py", line 30, in <module>
    assertEqual (computeMD5hash("The quick brown fox jumps over the lazy dog"),("9e107d9d372bb6826bd81d3542a419d6"))
  File "C:UsersShaneDocumentsAmer CISClab4.py", line 27, in computeMD5hash
    m.update(string)
TypeError: Unicode-objects must be encoded before hashing

мой код выглядит так:

def computeMD5hash(string):
    import hashlib
    from hashlib import md5
    m = hashlib.md5()
    m.update((string))
    md5string=m.digest()
    return md5string

4 ответов


как следует из ошибки, ваш string должен быть unicode, и вы должны его кодировать. Глядя на вызов, который вы делаете (из трассировки стека):

computeMD5hash("The quick brown fox jumps over the lazy dog")

похоже, что вы должны запускать Python 3, где строки являются объектами unicode. Чтобы кодировать в байтовое представление, которое затем может быть обработано hashlib, измените это

m.update((string))

к этому (если utf-8 является подходящей кодировкой для вас - это зависит от того, как вы будете использовать это):

m.update(string.encode('utf-8'))

если это все новости для вас, вы должны, вероятно, прочитать превосходную Python 3 Unicode HOWTO.


кроме того, пока я здесь, ваш код имеет некоторые другие вопросы

  • некоторые ненужные биты - нет необходимости в from hashlib import строка или временная md5string.
  • это плохая форма для импорта модулей из функции, поэтому import hashlib следует переместить в область модуля.
  • функция возвращение digest() который является сырым двоичным, и из вашей трассировки стека похоже, что вы ожидаете hexdigest() вместо этого это то же самое, что и шестнадцатеричная строка.

чтобы исправить и привести все в порядок, попробуйте следующее:

import hashlib

def computeMD5hash(my_string):
    m = hashlib.md5()
    m.update(my_string.encode('utf-8'))
    return m.hexdigest()

вместо того, чтобы пытаться хэшировать строку, вы должны хэшировать закодированную последовательность байтов. Вместо

>>> import hashlib
>>> hashlib.md5("fred")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing

вы должны закодировать его, например:

>>> "fred".encode("utf")
b'fred'
>>> hashlib.md5("fred".encode("utf")).hexdigest()
'570a90bfbf8c7eab5dc5d4e26832d5b1'

в Python 2 вы могли уйти, не делая этого, и это привело к бесконечным незамеченным ошибкам. К счастью, Python 3 имеет гораздо более разумную поддержку unicode и различает байты и строки.


кажется, вам нужно кодировать строку перед хэшированием:

http://www.dreamincode.net/forums/topic/246026-generating-string-hash-issue/


!/ usr/bin / env python

кодирование=utf-8

импорт sys, os, stat импорт pygtk, gtk импорт zbarpygtk импорт pycurl из от времени импорта strftime, localtime импорт панго

класс qrdat:

def __init__(self):

    """ VARIABLES DE CONFIGURACION """
    # Prefijo para el nombre de los archivos de registros 
    prefijo = 'Registro'

    # Lugar de almacenamiento de archivos de registros
    # Por defecto se guarda en la carpeta personal del usuario
    directorio = os.getenv('HOME')

    # Descomentar la siguiente linea y digitar la ruta de la carpeta
    # donde se guardaran los archivos

    #directorio = '/home/olpc/Escritorio'


    # Modo de reproduccion de sonido:
    # 1 : sonido enviado directamente a la tarjeta de sonido
    # 2 : sonido de alerta del sistema

    self.beep_mode = 1

    # No modificar abajo
    self.open_file = None
    self.video_device = '/dev/video0'
    self.fecha = strftime("%Y-%m-%d",localtime())
    self.filename = directorio+'/'+prefijo+'-'+self.fecha+'.csv'

    if len(sys.argv) > 1:
        self.video_device = sys.argv[1]

def decoded(self, zbar, data):
    """funcion invocada cuando un codigo es decodificado por el
    control zbar. 
    """
    datos = data.split(':')
    qrdata = datos[1]

    # guardar datos
    self.save(qrdata)        

    # sonido de recepcion
    self.beep(self.beep_mode)

    # mostrar datos
    buf = self.results.props.buffer
    end = buf.get_end_iter()
    buf.insert(end, self.hora()+' - '+qrdata+"\n")
    self.results.scroll_to_iter(end, 0)

def show(self):
    """Funcion que crea muestra la ventana principal """

    # threads *must* be properly initialized to use zbarpygtk
    gtk.gdk.threads_init()
    gtk.gdk.threads_enter()

    window = gtk.Window()
    window.set_title("Control de Asistencia QR")
    window.set_border_width(8)
    window.connect("destroy", gtk.main_quit)

    # zbar
    self.zbar = zbarpygtk.Gtk()
    self.zbar.connect("decoded-text", self.decoded)

    self.video_device = '/dev/video0'

    self.zbar.connect("notify::video-enabled", self.video_enabled)
    self.zbar.connect("notify::video-opened", self.video_opened)

    self.zbar.set_video_device(self.video_device)

    # combine combo box and buttons horizontally
    hbox = gtk.HBox(spacing=8)

    # text box for holding results
    self.results = gtk.TextView()
    self.results.set_size_request(320, 128)
    self.results.props.editable = self.results.props.cursor_visible = False
    self.results.modify_font(pango.FontDescription("monospace 12"))
    self.results.set_left_margin(4)

    # combine inputs, scanner, and results vertically
    vbox = gtk.VBox(spacing=8)
    vbox.pack_start(hbox, expand=False)
    vbox.pack_start(self.zbar)
    vbox.pack_start(self.results, expand=False)

    window.add(vbox)
    window.set_geometry_hints(self.zbar, min_width=320, min_height=240)
    window.show_all()


def run(self):
    """Funcion que inicia el funcionamiento de la ventana"""
    gtk.main()
    gtk.gdk.threads_leave()

def save(self,data):
    """ Funcion que guarda el archivo de registro """
    f = open(self.filename,'a')
    f.write(self.fecha+','+self.hora()+','+data+'\n')
    f.close()

def hora(self):
    """ Funcion que obtiene la hora local """
    return strftime("%H:%M:%S",localtime())

def beep(self, beep_mode):

    if os.access('/dev/audio', os.W_OK ) and beep_mode == 1:
        """ Genera un sonido enviado a la tarjeta de sonido"""
        frequency = 100
        amplitude = 200
        duration = 2
        sample = 8000
        half_period = int(sample/frequency/2)
        beep = chr(amplitude)*half_period+chr(0)*half_period
        beep *= int(duration*frequency)
        audio = file('/dev/audio', 'wb')
        audio.write(beep)
        audio.close()

    else:
        """ Reproduce sonido del propio sistema """
        f=open('/dev/tty','w')
        f.write(chr(7))
        f.close()


def video_enabled(self, zbar, param):
    """callback invoked when the zbar widget enables or disables
    video streaming.  updates the status button state to reflect the
    current video state
    """
    enabled = zbar.get_video_enabled()


def video_opened(self, zbar, param):
    """callback invoked when the zbar widget opens or closes a video
    device.  also called when a device is closed due to error.
    updates the status button state to reflect the current video state
    """
    opened = zbar.get_video_opened()

def video_changed(self, widget):
    """callback invoked when a new video device is selected from the
    drop-down list.  sets the new device for the zbar widget,
    which will eventually cause it to be opened and enabled
    """
    dev = self.video_list.get_active_text()
    if dev[0] == '<':
        dev = ''
    self.zbar.set_video_device(dev)

если имя =="main":

qr = qrdat()
qr.show()
qr.run()