我正在使用此代码创建哈希,从提供字符串到转发 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代码创建的哈希进行比较,而不是结果。
这个代码的男人问题是什么。
谢谢
答案 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)强>