2008-09-22 12 views

Répondre

6

bibliothèque Sauf si vous avez un très bonne raison, utiliser MD5 intégré dans glib, SHA1 et mises en œuvre avec SHA256 GChecksum. Il n'a pas de fonction intégrée pour construire une somme de contrôle à partir d'un flux d'E/S, mais vous pouvez en écrire une simple sur 10 lignes, et vous devrez en écrire une de toute façon.

2

Vous devez normalement faire des trucs de colle ... vous

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); 
}