Re: problem with applying md5 to data
Re: problem with applying md5 to data
- Subject: Re: problem with applying md5 to data
- From: Wilker <email@hidden>
- Date: Wed, 29 Jun 2011 04:42:15 -0300
Thanks for the answer Quincey,
I did resolved just before you post here :)
Used this (now in separated files):
+(NSString *)md5HexDigestFromChar:(const void *)str
withLength:(CC_LONG)lenght {
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, lenght, result);
NSMutableString *ret = [NSMutableString
stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"x", result[i]];
}
return [ret lowercaseString];
}
+(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];
return [SMEncodingUtilities md5HexDigestFromChar:[fileData bytes]
withLength:(unsigned int)[fileData length]];
}
You said the way I readed the file is bad... But I don't need to read the
entire file, just 64kb of first, and 64kb of last, are you sure that will be
better to read it entirely?
Thanks for the support :)
---
Wilker LĂșcio
http://about.me/wilkerlucio/bio
Kajabi Consultant
+55 81 82556600
On Wed, Jun 29, 2011 at 4:27 AM, Quincey Morris <email@hidden
> wrote:
> 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