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
2008-09-22 02:19:17
+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
2008-09-22 02:26:08