MD5-подпрограммы, дружественные GLib? - PullRequest
6 голосов
/ 22 сентября 2008

Кто-нибудь знает о процедуре MD5 / SHA1 / etc, которую легко использовать с GLib (т.е. вы можете дать ей канал GIOC и т.д.)?

Ответы [ 2 ]

6 голосов
/ 22 сентября 2008

Если у вас нет очень веской причины, используйте встроенные в glib реализации MD5, SHA1 и SHA256 с GChecksum. Он не имеет встроенной функции для создания контрольной суммы из потока ввода-вывода, но вы можете написать простую из 10 строк, и вам все равно придется написать сложную самостоятельно.

2 голосов
/ 22 сентября 2008

Обычно вы должны сами делать библиотечный клей ...

void get_channel_md5( GIOChannel* channel, unsigned char output[16] )
{
    md5_context ctx;

    gint64 fileSize = <get file size somehow?>;
    gint64 filePos = 0ll;

    gsize bufferSize = g_io_channel_get_buffer_size( channel );
    void* buffer = malloc( bufferSize );

    md5_starts( &ctx );

    // hash buffer at a time: 
    while ( filePos < fileSize )
    {
        gint64 size = fileSize - filePos;
        if ( size > bufferSize )
            size = bufferSize;

        g_io_channel_read( channel, buffer );
        md5_update( &ctx, buffer, (int)size );

        filePos += bufferSize;
    }

    free( buffer );

    md5_finish( &ctx, output );
}
...