tags:

views:

471

answers:

2

Does anyone know of an MD5/SHA1/etc routine that is easily used with GLib (i.e. you can give it a GIOChannel, etc)?

+2  A: 

You normally have to do library glue stuff yourself...

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 );
}
Simon Buchan
+5  A: 

Unless you have a very good reason, use glib's built-in MD5, SHA1, and SHA256 implementations with GChecksum. It doesn't have a built-in function to construct a checksum from an IO stream, but you can write a simple one in 10 lines, and you'd need to write a complex one yourself anyway.

John Millikin