ここでは基本的なCC_SHA256の例です:CC_SHA256は異なる入力に対して同じ出力を生成
-(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);
}
このアルゴリズムが正しく動作しているように見えます。少しテスト:
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>
:私は3に第二引数(input.length)を変更した場合、私は次の出力を取得し、今
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>
:
NSString* str = @"abcde";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
[self hash:data];
NSString* str2 = @"fghijk";
NSData* data2 = [str2 dataUsingEncoding:NSUTF8StringEncoding];
[self hash:data2];
は、次のような出力を提供します
これらのハッシュは同じです。私はCC_SHA256アルゴリズムが自分の入力の最初の3文字をハッシュするだけだと思うが、明らかにそれはそのようには動作しない。さらに、シミュレータを再起動すると、生成されたハッシュが最初とは違っています(しかし、まだ同じです)。
この現象はなぜ発生しますか?この問題に対する(明らかな)回避策を提示しないでください。私は本当にアルゴリズムがこのように動作する理由を知りたがっています。
私はあなたがハッシュのために右の引数に渡しているとは思いません。 'CFBridgingRetain(input)'の代わりに 'input.bytes'を渡してみてください。私の推測では、 'NSData'に関連する内部データをハッシュしている' input'の参照を渡すだけなので、最初の数バイトは同じで、ランチの間で異なります。 SHAは決定論的でなければならないので、同じ入力に対して変更されているという事実は、あなたが間違ってそれを使用していることを意味します。 – Jack
あなたは正しいようです。私はまた、ランダムな性質が非常に奇妙だと思った。私はそれを正しいとマークすることができるようにあなたの答えを加えることができますか? – Dauntless
しかし、実際のアプリケーションでは、入力文字列がずっと長く(64文字)、入力サイズが32に設定されています。全く違う文字列でも同じハッシュ値が得られます... – Dauntless