Objective-C SHA2哈希与非ASCII无法正常工作

eva*_*ong 6 hash objective-c sha2 sha512 ios

我正在使用xcode,这是我的sha512方法:

-(NSString*) sha512:(NSString*)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];

    uint8_t digest[CC_SHA512_DIGEST_LENGTH];

    CC_SHA512(data.bytes, data.length, digest);

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];

    for (int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }

    return output;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试通过输入"测试",则返回:"ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"它匹配其他SHA512哈希工具(包括我的Java程序和"http://hash.online-convert.com/sha512-generator").

但是,当我输入像"é"这样的非ascii字符时,它会返回与我所有其他sha512工具不同的东西.对于输入"é",我的方法返回:"60313f8521d3016916d876f7ad11cf42a30dfd4ff9bc557f1e2f90e0d37c56b76ab5e42c8a16db20c18086b0d769c08542429c262cc21ee4fba02bfc689a4797"当其他工具(包括一次我的Java程序和"http://hash.online-convert.com/sha512-generator")返回"9e2ad28633f24451bd4f3c1cb20586a21a44c3aeedbdc01b9cc8fa72917ea7bd689c82b8bf1fef89b911cf8cc46fa2c1ccc10087b2094fd4d3350ecd88526a2c".

我错过了什么吗?有关于此的任何想法?谢谢!

hyp*_*ypt 4

NSData像这样创建你的对象:

NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

只需仔细检查,它就可以正常工作。

  • 问题在于“-[NSString length]”是字符串中的字符数,而不是以特定编码表示这些字符所需的字节数。“é”是一个字符,但在某些编码中,对包含 e 和锐音符号的信息进行编码可能会占用多个字节。 (2认同)