2013-09-24 1 views
3

Я использую этот код для создания hash от передачи строки к передаче IOS Приложение.Создание iOS SHA1 Hash с символами UTF-8

-(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)); 

У меня есть строка, которая содержит арабских языков.

когда я создаю хэш от английского строки и сравнить его с хэш, созданной из PHP кода под Ubuntu * сильного текста * результат будет таким же.

но когда я создаю хэш с арабский персонаж это будет и сравнить его с хешем, созданным с помощью php-кода, не приведет к результату.

так что это за проблема с этим кодом.

Благодаря

+0

Вы можете разместить php-код для создания хэша? – doptimusprime

+2

input.length - это количество символов в строке, а не количество байтов в представлении данных с кодировкой UTF8. Вы похожи Если вы преобразуете его в NSData, вы обрезаете строку. Попробуйте использовать - [NSString dataUsingEncoding:] вместо – iccir

+1

да конечно: return sha1 (json_encode ($ array)); –

ответ

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.

+0

Извините Mr Zaph, что он не работает для меня –

+0

Вы уверены, что php использует кодировку UTF8? Возможно, он использует UTF16 - или другую кодировку. Попробуйте отобразить фактические байты в строке php Arabic. – zaph

1

Я нашел свою проблему, которая исходит от моего PHP json_encode ($ array).

так что я нашел эту функцию в http://php.net/manual/en/function.json-encode.php, которые кодируют мой JSON с UTF-8 характер

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)

Смежные вопросы