使用UTF-8字符创建iOS SHA1哈希

时间:2013-09-24 10:22:43

标签: objective-c hash utf-8

我正在使用此代码创建哈希,从提供字符串到转发 IOS 应用。

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

 uint8_t digest[CC_SHA1_DIGEST_LENGTH];

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

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

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

 return output;

}

我的PHP代码是

 sha1(json_encode($array));

我的字符串包含阿拉伯语语言。

当我从英语字符串创建哈希并将其与从Ubuntu * 强文 *下的 php 代码创建的哈希进行比较时,结果将是同样的。

但是当我使用阿拉伯语字符创建哈希时,它会将它与从PHP代码创建的哈希进行比较,而不是结果。

这个代码的男人问题是什么。

谢谢

2 个答案:

答案 0 :(得分:4)

input.length是字符数,而不是字节数,区别在于UTF8编码下的许多字节长度是多个字节。

替换:

const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];

使用NSString方法:

NSData *data = [input  dataUsingEncoding: NSUTF8StringEncoding];

不需要中间人const char *cstr

答案 1 :(得分:1)

我发现我的问题来自我的 PHP json_encode($ array)函数。

所以我在http://php.net/manual/en/function.json-encode.php中找到了这个函数,用 UTF-8 字符编码我的json

function my_json_encode($arr)
{
    //convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding
   array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); });
   return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');

 }

EX:

<强> SHA1(my_json_encode($ newArray)