Cocoa touch CC_SHA1之后的NSData到NSString

Cocoa touch CC_SHA1之后的NSData到NSString,cocoa-touch,hash,Cocoa Touch,Hash,基于此,我使用SHA1在NSString上编写了一个类别,以hash NSString实例。然而,我的实现有一些问题。有趣的是,记录NSData实例确实会给出预期的散列,但是当我想从该NSData实例创建NSString时,我只会得到null - (NSString *)sha1 { NSData *dataFromString = [self dataUsingEncoding:NSUTF8StringEncoding]; unsigned char hashed[CC_SHA

基于此,我使用SHA1在
NSString
上编写了一个类别,以
hash NSString
实例。然而,我的实现有一些问题。有趣的是,记录NSData实例确实会给出预期的散列,但是当我想从该NSData实例创建NSString时,我只会得到null

- (NSString *)sha1 {
    NSData *dataFromString = [self dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char hashed[CC_SHA1_DIGEST_LENGTH];

    if ( CC_SHA1([dataFromString bytes], [dataFromString length], hashed) ) {
        NSData *dataFromDigest = [NSData dataWithBytes:hashed length:CC_SHA1_DIGEST_LENGTH];

        NSString *result = [[NSString alloc] initWithBytes:[dataFromDigest bytes] length:[dataFromDigest length] encoding:NSUTF8StringEncoding];

        return result;

    } else {

        return nil;
    }
}

谢谢你的帮助

散列函数的输出只是一堆简单的字节。您将获取这些字节,本质上告诉NSString它们表示UTF8编码的字符串,而它们不表示UTF8编码的字符串。生成的NSString只是垃圾


听起来你真正想要的是一个十六进制的字符串,代表散列值?如果是这样的话,我相信您将需要通过循环每次遍历一个字节的
dataFromDigest
,并根据字节的值将正确的十六进制数字输出到一个新的NSMutableString中来实现这一点。你可以自己做,也可以使用网络上的一些代码。看起来很有希望

谢谢吉诃多。这澄清了很多!