• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: problem with applying md5 to data
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

  • Follow-Ups:
    • Re: problem with applying md5 to data
      • From: Quincey Morris <email@hidden>
    • Re: problem with applying md5 to data
      • From: Wilker <email@hidden>
References: 
 >problem with applying md5 to data (From: Wilker <email@hidden>)

  • Prev by Date: NSDocument new file logic
  • Next by Date: Re: problem with applying md5 to data
  • Previous by thread: problem with applying md5 to data
  • Next by thread: Re: problem with applying md5 to data
  • Index(es):
    • Date
    • Thread