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 15:32:41 -0300
Thanks again Quincey.
Just for curiousity, if I do the line:
const uint8_t* buffer = [fileData bytes];
it will not read the entire file? or these address are pointed direct on
disk so they are load on demand?
also, just to mean if I understand here:
CC_MD5_Update(&md5, buffer + byteOffset, byteLength);
in the sum "buffer + byteOffset", in case, adding a number to an array
pointer will change it offset?
---
Wilker LĂșcio
http://about.me/wilkerlucio/bio
Kajabi Consultant
+55 81 82556600
On Wed, Jun 29, 2011 at 2:53 PM, Quincey Morris <email@hidden
> wrote:
> On Jun 29, 2011, at 07:08, Wilker wrote:
>
> > char buffer[CHUNK_SIZE];
>
> > [fileData getBytes:buffer range:NSMakeRange(0, CHUNK_SIZE)];
> > CC_MD5_Update(&md5, buffer, CHUNK_SIZE);
> > [fileData getBytes:buffer range:NSMakeRange(MAX(0, [fileData length]
> - CHUNK_SIZE), CHUNK_SIZE)];
> > CC_MD5_Update(&md5, buffer, CHUNK_SIZE);
>
> Personally, having tried to get the file reads as cheaply as possible**,
> I'd just do this:
>
> const uint8_t* buffer = [fileData bytes];
> // calculate byteLength and byteOffset (see below)
>
> CC_MD5_Update(&md5, buffer, byteLength);
> CC_MD5_Update(&md5, buffer + byteOffset, byteLength);
>
> [fileData self];
>
> to avoid copying the raw data unnecessarily.
>
> Your code still has the bug in the MAX parameters (if [fileData length] >
> CHUNK_SIZE, then [fileData length] - CHUNK_SIZE is a *very* large positive
> number), and you've introduced a new one -- 'getBytes:range:' will crash if
> the range goes past the end of the NSData data, so I'd calculate the length
> and offset like this:
>
> NSUInteger byteLength = [fileData length];
> NSUInteger byteOffset = 0;
>
> if (byteLength > CHUNK_SIZE) { // ***
> byteLength = CHUNK_SIZE;
> byteOffset = byteLength - CHUNK_SIZE;
> }
>
>
>
> ** There are some drawbacks to using very large stack-based structures. At
> least:
>
> a. If this code is ever part of a background thread, the default maximum
> stack size isn't large enough to accommodate 65K data structures.
>
> b. If this is running under garbage collection, the collector must scan the
> entire 65K every time it runs, uselessly and wastefully.
>
> What's the usual way to solve these problems? To move the data structure
> off the stack into the heap. But you already have the data in the heap, in
> your NSData object.
>
> *** Someone once pointed out on this list that you should never use MIN and
> MAX (and other such convenience macros) in production code, because you are
> never quite certain how they're implemented (in terms of handling mismatched
> sign expressions, for example) and how they might be implemented on some
> future platform you might want to port this code to. Therefore, he said, you
> should write the code you want, not hope for the code you need. I think
> maybe his point was a little obsessive, but I have to admit I now cringe and
> hesitate before writing MIN or MAX. :)
_______________________________________________
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