2008-09-22 13 views
6

GLib ile kolayca kullanılan bir MD5/SHA1/etc rutinini bilen var mı? (Yani bunu bir GIOChannel verebilir misiniz?)?MD5 rutinleri?

cevap

6

var kullanmak geveze dahili MD5, SHA1 ve GChecksum ile SHA256 uygulamaları. Bir IO akışından bir sağlama toplamı inşa etmek için yerleşik bir işlevi yoktur, ancak 10 satırda basit bir tane yazabilirsiniz ve yine de karmaşık bir tane yazmanız gerekir.

2

Normalde bir çok iyi bir neden yoksa, ... kütüphane tutkal Stuff kendiniz yapmak

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