[Python] Md5 all'interno di un modulo python

Daniele Varrazzo piro a develer.com
Ven 11 Nov 2011 16:20:25 CET


On Fri, 11 Nov 2011 15:55:06 +0100, drama <drama a autistici.org> wrote:
> Il 11/11/2011 14:59, Marco Giusti ha scritto:
>> On Fri, Nov 11, 2011 at 01:16:29PM +0100, drama wrote:
>>> Buongiorno a tutta la lista,
>>>
>>> Sto scrivendo in c un modulo python e mi ritrovo ad aver
>>> bisogno di calcolare l'md5 di una stringa di testo.
>>>
>>> Mi chiedevo se e come fosse possibile riutilizzare l'hexdigest
>>> del modulo md5.
>> non mi sono mai addentrato troppo sull'argomento python+c ma a mio
>> avviso hai due opzioni:
>>
>> 1. fai tutto da c importando il modulo[1] e poi accedendo alle varie
>> funzioni oppure
> 
> Cosi' ho fatto.

...
>   md5Module = PyObject_GetAttr(md5Import, PyString_FromString("md5"));

Questo è un reference leak.


>   md5object = PyObject_Call(md5Module, args, NULL);  /* args e' una
> lista. Contiene un elemento solo, stringa */
> 
>   digestFunc = PyObject_GetAttr(md5object,
> PyString_FromString("hexdigest"));
>  
>   md5digest = PyObject_CallFunction(digestFunc, NULL);
> 
>   printf("%s",  PyString_AsString(md5digest));

Ovviamente distruzione degli oggetti e controllo delle eccezioni è
lasciato fuori "solo perché è un esempio"... vero? :)


Una versione un po' più idiomatica è la seguente. Da salvare come md5.c e
compilare con:

     gcc `python-config --cflags` -o md5 md5.c `python-config --ldflags`

Poi si può eseguire con:

     $ ./md5 qualcosa
     dae93754559698297eb6b62a0b746172

(per favore, non ho voglia di insultare nessuno di venerdì, quindi se
sentite il bisogno di sostenere che goto non vada usato, considerate la mia
risposta come "non sai quello di cui stai parlando, prendi questa palla e
vai a giocare in cortile" ed evitate di farmi rispondere).


----------

#include <Python.h>

/*
 * Return the md5 hexdigest of str as a new python string.
 */
PyObject *
calc_md5(const char *str)
{
    PyObject *module = NULL;
    PyObject *new = NULL;
    PyObject *hash = NULL;
    PyObject *rv = NULL;

    /* import hashlib */
    if (!(module = PyImport_ImportModule("hashlib"))) { goto exit; }

    /* hash = hashlib.md5(str) */
    if (!(new = PyObject_GetAttrString(module, "md5"))) { goto exit; }
    if (!(hash = PyObject_CallFunction(new, "s", str))) { goto exit; }

    /* return hash.hexdigest() */
    rv = PyObject_CallMethod(hash, "hexdigest", "");

exit:
    Py_XDECREF(hash);
    Py_XDECREF(new);
    Py_XDECREF(module);

    return rv;
}

int
main(int argc, char *argv[])
{
    int rv = 1;
    PyObject *md5 = NULL;

    if (argc < 2) {
        fprintf(stderr, "usage: %s STRING\n", argv[0]);
        rv = 2;
        goto exit;
    }

    Py_Initialize();

    if ((md5 = calc_md5(argv[1]))) {
        printf("%s\n", PyString_AsString(md5));
        Py_CLEAR(md5);
        rv = 0;
    }
    else {
        PyErr_Print();
    }

    Py_Finalize();

exit:
    return rv;
}


-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python