Hier ist ein grundlegendes CC_SHA256 Beispiel:CC_SHA256 erzeugt gleiche Leistung für die verschiedenen Eingang
-(void)hash:(NSData *)input
{
NSLog(@"Input is %@", [self NSDataToHex:input]);
NSMutableData *result = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
CC_SHA256(CFBridgingRetain(input), input.length, result.mutableBytes);
NSLog(@"RESULT is %@", result);
}
Dieser Algorithmus korrekt zu funktionieren scheint. Ein kleiner Test:
NSString* str = @"abcde";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
[self hash:data];
NSString* str2 = @"fghijk";
NSData* data2 = [str2 dataUsingEncoding:NSUTF8StringEncoding];
[self hash:data2];
gibt die folgende Ausgabe:
Input is 6162636465
RESULT is <91681b5f 162cf494 238e5cac 0debbe92 c3ede9bf 4bcc7e79 845b774f b33e99f7>
Input is 666768696A6B
RESULT is <cccf7b6f 9acb96ae 84e9852b 1a753825 d6750555 57175c78 f86cf5fb bb3cfca7>
Nun, wenn ich das zweite Argument (input.length) bis 3 ändern, ich folgende Ausgabe:
Input is 6162636465
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570>
Input is 666768696A6B
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570>
Diese Hashes sind gleich. Ich würde erwarten, dass der CC_SHA256-Algorithmus nur die ersten drei Zeichen meiner Eingabe hashen würde, aber anscheinend funktioniert das nicht so. Außerdem, wenn ich den Simulator neu starte, sind die erzeugten Hashes verschieden vom ersten Mal (aber immer noch gleich).
Warum passiert dieses Verhalten? Bitte geben Sie keine (offensichtliche) Workaround für dieses Problem. Ich möchte wirklich wissen, warum sich der Algorithmus so verhält.
Ich glaube nicht, dass Sie in die richtigen Argumente für die Hash vorbei sind. Versuchen Sie, 'input.bytes' anstelle von' CFBridgingRetain (input) 'zu übergeben. Meine Vermutung ist, wenn Sie nur die Referenz von "Eingabe" übergeben Sie Hashing einige interne Daten im Zusammenhang mit 'NSData' und damit die ersten paar Bytes sind die gleichen und unterscheiden sich zwischen Lanches. SHA sollte deterministisch sein, so dass die Tatsache, dass es sich für dieselbe Eingabe ändert, bedeutet, dass Sie es falsch verwenden. – Jack
Sie scheinen richtig zu sein. Ich fand auch, dass die zufällige Natur sehr seltsam war. Kannst du deine Antwort hinzufügen, damit ich sie als richtig markieren kann? – Dauntless
Der unglückliche Teil ist jedoch, dass in der realen Anwendung die Eingabezeichenfolge viel länger ist (64 Zeichen) und die Eingabegröße auf 32 gesetzt wird. Beide (völlig verschiedene) Zeichenfolgen geben immer noch den gleichen Hashwert ... – Dauntless