Re: problem with applying md5 to data
Re: problem with applying md5 to data
- Subject: Re: problem with applying md5 to data
- From: Quincey Morris <email@hidden>
- Date: Wed, 29 Jun 2011 00:27:59 -0700
On Jun 29, 2011, at 00:02, Wilker wrote:
> I'm trying to implement it on Objective-C but I'm having really trouble on
> it...
There are many things wrong with your implementation.
> +(NSString *)generateHashFromPath:(NSString *)path {
> const NSUInteger CHUNK_SIZE = 65536;
>
> NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
>
> if (file == nil) return nil;
>
> unsigned long fileSize = [[[NSFileManager defaultManager]
> attributesOfItemAtPath:path error:nil] fileSize];
>
> NSMutableData *fileData = [[NSMutableData alloc]
> initWithCapacity:CHUNK_SIZE * 2];
>
> [fileData appendData:[file readDataOfLength:CHUNK_SIZE]];
> [file seekToFileOffset:MAX(0, fileSize - CHUNK_SIZE)];
> [fileData appendData:[file readDataOfLength:CHUNK_SIZE]];
>
> [file closeFile];
This is not the worst way to read the entire contents of a file into a NSData object, but it's pretty bad. :)
It would be far easier and more efficient to use [NSData dataWithContentsOfFile: path options: NSDataReadingMapped | NSDataReadingUncached error: NULL];
> NSString *dataString = [[NSString alloc] initWithData:fileData
> encoding:NSASCIIStringEncoding];
You say the file contains binary data. Running it through the ASCII string encoding is going to throw away every character that isn't ASCII (i.e. it will throw away every character with its high order bit set). That isn't what you want.
Also, converting a large NSData object to a NSString via any encoding is going to be horrendously expensive (in CPU and memory cost). That isn't what you want.
> return [[SMSubdbSource md5:dataString] lowercaseString];
> }
> +(NSString *)md5:(NSString *)str {
> const char *cStr = [str UTF8String];
Since you're passing in a (NSString) string of ASCII characters, you're going to get out a (C) string of exactly the same ASCII characters, since ASCII characters are represented by themselves in UTF8. This isn't what you want.
> unsigned char result[16];
> CC_MD5(cStr, (unsigned int) strlen(cStr), result);
> return [NSString stringWithFormat:
>
> @"XXXXXXXXXXXXXXXX",
> result[0], result[1], result[2], result[3],
> result[4], result[5], result[6], result[7],
> result[8], result[9], result[10], result[11],
> result[12], result[13], result[14], result[15]
> ];
> }
If you're trying to compute the digest of the binary data, you can compute it directly from the NSData object like this:
CC_MD5 (fileData.bytes, fileData.length, result);
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden