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

Objective c 使用UTF-8字符创建iOS SHA1哈希,objective-c,hash,utf-8,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_

我正在使用这段代码创建哈希,从给出字符串到导出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;

}
我有一个包含阿拉伯语语言的字符串

当我从English字符串创建哈希,并将其与Ubuntu*strong text*下从php代码创建的哈希进行比较时,结果将是相同的

但是当我用阿拉伯文字符创建散列时,它会这样做,并将其与php代码创建的散列进行比较,结果不会有什么不同

那么这个代码的人有什么问题呢


感谢输入。长度是字符数,而不是字节数,区别在于UTF8编码下的许多字节的长度是多个字节

替换:

const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
使用NSString方法:

NSData *data = [input  dataUsingEncoding: NSUTF8StringEncoding];

不需要中间的
const char*cstr

我发现我的问题来自我的PHP json\u encode($array)函数

因此,我在其中找到了这个函数,它用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');

 }
例:


sha1(my_json_encode($newArray)

您可以发布用于创建哈希的php代码吗?input.length是字符串中的字符数,而不是UTF8编码数据表示形式中的字节数。在将字符串转换为NSData时,您可能会截断字符串。请尝试使用-[NSString dataUsingEncoding:]取而代之的是肯定的:返回sha1(json_encode($array));Mr.iccir您的意思是用NSData*数据替换NSData*数据=[NSData DATAWITHEBYTES:cstr encode:];您确定php使用的是UTF8编码吗?可能是UTF16--或其他编码。请尝试在php阿拉伯语字符串中显示实际字节。
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');

 }