Quiero hash de una simple matriz de cadenas
La documentación dice que no puede simple alimentar a una cadena en hashlib la función update (),
así que he intentado regular de la variable, pero luego me la TypeError: object supporting the buffer API required error.

Aquí es lo que he tenido hasta el momento

def generateHash(data):
    # Prepare the project id hash
    hashId = hashlib.md5()

    hashId.update(data)

    return hashId.hexdigest()
  • hasta donde yo sé, usted debe ser capaz de alimentar a una cadena en hashlib la función de actualización, podrías dar más información?
InformationsquelleAutor skerit | 2013-07-01

3 Comentarios

  1. 9

    Puede utilizar el repr() función para obtener la (Unicode) representación de cadena de la matriz (o de cualquier objeto que implementa la conversión a una representación). Luego codificar la cadena de caracteres a UTF-8 (el orden de los bytes es la misma en todas partes, cuando el uso de UTF-8). Los bytes resultantes pueden ser discutidos como se trató anteriormente:

    #!python3
    import hashlib
    
    def hashFor(data):
        # Prepare the project id hash
        hashId = hashlib.md5()
    
        hashId.update(repr(data).encode('utf-8'))
    
        return hashId.hexdigest()
    
    
    if __name__ == '__main__':
        data1 = ['abc', 'de']
        data2 = ['a', 'bcde']
        print(hashFor(data1) + ':', data1)
        print(hashFor(data2) + ':', data2)

    Se imprime en mi consola:

    c:\tmp\___python\skerit\so17412304>py a.py
    d26d27d8cbb7c6fe50637155c21d5af6: ['abc', 'de']
    dbd5ab5df464b8bcee61fe8357f07b6e: ['a', 'bcde']
    • No hay ninguna garantía de que un objeto cualquiera del __repr__ devuelve algo que es una información muy útil para la función hash. hashlib objetos en sí, por ejemplo, repr() a ‘<HASH md5 objeto @ 0x7fb503555a80>’. Incluso ignorando las desagradables consecuencias si este se utiliza para algunos operación criptográfica, esto no es determinista! El mismo programa se ejecute en diferentes tiempos no devuelven el mismo valor de hash.
    • La respuesta es relativa a la matriz de cadenas. Estás en lo correcto. Uno no debe usar el martillo para cada trabajo.
    • Usted debe tratar de usar algo como ",".join(data) como __repr__ no está garantizado para ser coherente con futuras versiones. Tal vez Python 4 devuelve un poco diferente de la cadena (por ejemplo, s'abc en lugar de 'abc').
    • Es poco probable. De todos modos, la pregunta es bastante viejo, y la situación puede haber cambiado. El ','.join(data) es buggy como ['a,', 'bb'] produciría el mismo resultado que ['a', ',bb']. Pero tiene usted razón. Cualquier función que captura la representación de la matriz de cadenas y devuelve los bytes puede ser utilizado para calcular el valor hash.
    • Sí, pero el objetivo era tener la representación de cadena de un lista de las cadenas.
  2. 1

    Si quieres hash de una lista de cadenas, un ingenuo solución podría ser:

    def hash_string_list(string_list):
        h = hashlib.md5()
        for s in string_list: # Note that you could use ''.join(string_list) instead
            h.update(s)       # s.encode('utf-8') if you're using Python 3
        return h.hexdigest()

    Sin embargo, tenga cuidado de que ['abc', 'efg'] y ['a', 'bcefg'] hash para el mismo valor.

    Si usted proporciona más contexto con respecto a su objetivo, otras soluciones podrían ser más apropiado.

    • …excepto que update toma bytes, por lo que si usted tiene cadenas de la necesidad de codificar en primer lugar.
    • Oh, no me di cuenta de que era un python3 pregunta – lo siento.
  3. 1

    Dependiendo de lo que quieras hacer, obtener el hash de todas las cadenas concatenadas o hash de cada cuerda por separado. usted puede conseguir el puño siguiendo a santo Tomás de solución como
    m.actualización(a); m.actualización(b) es equivalente a m.actualización(a+b).
    O la tarde siguiente a continuación de la solución

    def generateHash(data):
        # Prepare the project id hash
    
        return [hashlib.md5(i.encode('utf-8')).hexdigest() for i in data]

    Nota que devuelve una lista. Cada elemento es el hash de un elemento correspondiente en la lista de cadenas

Dejar respuesta

Please enter your comment!
Please enter your name here