Simple Profiling of MD5
MD5 (Message-Digest) is an algorithm commonly used as cryptographic hash function. It takes an arbitrary length of data and produces a 128-bit (16 bytes) hash value. MD5 is not recommended for secure applications any more because attack messages can be constructed to produce collision. However, without intentional attack, MD5 is extremely unlikely to produce a collision and the computation is fast (later part will provide test code). Therefore it is still useful as a hash function in situations where security is not a concern and collision is not desired.
Reference 2 provides links to lots of implementations of MD5 in various programming languages. This post takes the code from L. Peter Deutsch implementation added a test function to test how fast MD5 computes.
The test uses a a list of url strings stored in a file. It will read the string from file and compute the md5 for each URL. The test function is as below,
static int do_n_test(void) {
FILE *testFile;
int UNIQUE_URLS = 1000;
unsigned char url[UNIQUE_URLS][4096];
int numOfUrlsTested = 0;
int i = 0, j, READ_FILE_TIMES = 1;
struct timeval stTime, edTime;
testFile = fopen("./urllist.txt", "r");
if (testFile == NULL) {
printf("cannot open test file\n");
return;
}
for (; i < UNIQUE_URLS; ++i) {
fgets(url[i], 4096, testFile);
}
fclose(testFile);
gettimeofday(&stTime, NULL);
for (i = 0; i < READ_FILE_TIMES; ++i) {
for (j = 0; j < UNIQUE_URLS; ++j) {
md5_state_t state;
md5_byte_t digest[16];
char hex_output[16*2 + 1];
int di;
md5_init(&state);
md5_append(&state, (const md5_byte_t *)url[j], strlen(url[j]));
md5_finish(&state, digest);
/*for (di = 0; di < 16; ++di)
sprintf(hex_output + di * 2, "%02x", digest[di]);
printf("%d: %s\n", numOfUrlsTested, hex_output);*/
++numOfUrlsTested;
}
}
gettimeofday(&edTime, NULL);
printf("%d: %u:%u\n", numOfUrlsTested, (unsigned int)(edTime.tv_sec - stTime.tv_sec), (unsigned int)(edTime.tv_usec - stTime.tv_usec));
}
The test file contains more than 3000 urls, but loading all URLs from the file may exceed the stack memory you can use. You can set the “UNIQUE_URLS” variable to adjust the number of unique URLs to load. You can also adjust the “READ_FILE_TIMES” variable to set number of MD5 computations to run. The total number of MD5 computations will be “UNIQUE_URLS”x“READ_FILE_TIMES”.
To compile the code, use the command,
gcc -o test md5.c md5main.c –lm
To run test,
./test –test
On my Ubuntu machine with Intel i5 Quad Core, 1197 MHz, 4GB Memory, one MD5 computation takes about 4 macro seconds.
You can download the entire code from here. Note that the main MD5 computation code is from reference 2 by L. Peter Deutsch.
References:
1. MD5 Wikipedia Page: http://en.wikipedia.org/wiki/Md5
2. MD5 Homepage (unofficial): http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html
3. Hash functions: An empirical comparison: http://www.strchr.com/hash_functions
Leave a Reply Cancel reply
40% Discount on My Book — Android NDK Cookbook
Android NDK Cookbook ebook 40% discount with promotion code MREANC40 at Packt Publishing The promotion code is valid until 15th June.Categories
- Android Apps (18)
- Android Audio Editor (1)
- TS 2 (3)
- Video Converter Android (8)
- Video2Gif (1)
- Android Tutorial (27)
- Android Dev Tools (1)
- API illustrated (8)
- Multimedia API (3)
- ffmpeg on Android (4)
- NDK (6)
- UI (6)
- Animation (2)
- Code Snippet (2)
- Coding Beyond Technique (18)
- a word, a world (4)
- Bug Rectified (4)
- Programming Habit (1)
- Software as a Career (1)
- Software as User Experience (1)
- Compilers and Related (2)
- ELF (2)
- Computer Languages (31)
- C/C++ (13)
- Java (9)
- JavaScript (2)
- PHP (1)
- Python (8)
- Data Structure & Algorithms (29)
- Bits (1)
- Data Structure (5)
- Integers (10)
- BigInteger (1)
- Prime (4)
- Search (3)
- Sorting (5)
- Strings (5)
- Database (1)
- SQLite (1)
- Digital Signal Processing (33)
- Distributed Systems (17)
- Apache Cassandra (6)
- Apache Hadoop (8)
- Apache Avro (3)
- Apache Nutch (3)
- Apache Solr (1)
- Linux Study Notes (40)
- crontab (1)
- Linux Kernel Programming (8)
- Linux Programming (12)
- IPC (2)
- Linux Network Programming (5)
- Linux Signals (2)
- Linux Shell Scripting (1)
- ssh (3)
- Machinery (30)
- misc (1)
- My Ideas (1)
- My Project (3)
- Mobile Caching (1)
- Selective Decoding (2)
- My Publication (1)
- My Readings (1)
- Networking (15)
- Program for Performance (8)
- Uncategorized (1)
- Virtual Machine (2)
- Web Dev (8)
- web components (3)
- Android Apps (18)
Recent Comments
Archives
- May 2013 (2)
- April 2013 (1)
- March 2013 (4)
- December 2012 (2)
- November 2012 (6)
- October 2012 (6)
- September 2012 (3)
- August 2012 (13)
- July 2012 (15)
- June 2012 (3)
- May 2012 (8)
- April 2012 (4)
- March 2012 (13)
- February 2012 (19)
- January 2012 (9)
- December 2011 (11)
- November 2011 (12)
- October 2011 (4)
- September 2011 (12)
- August 2011 (16)
- July 2011 (15)
- June 2011 (6)
- May 2011 (10)
- April 2011 (13)
- March 2011 (20)
- February 2011 (4)
- November 2010 (2)
- May 2010 (1)
- April 2010 (1)
- February 2010 (1)




