8

Unicode文字列を取得し、それをMD5ハッシュ関数に渡して、結果をBase64としてエンコードしようとしています。すべて同じ結果を返すには、MSSQL、Java、Obj-Cが必要です。MSSQLとJavaに同意していますが、Obj-Cを使用して同じ結果を得ることができません。

Javaコード(「SC0RfYWqWLK / YNpIDdGi8w ==」を返します)

String input = "chinese lorem ipsum 槏殟殠巘斖蘱飣偓啅撱簻臗";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] inputBytes = input.getBytes("UTF-16LE");
md.update(input.getBytes("UTF-16LE"));
byte[] enc = md.digest();
String md5Sum = new sun.misc.BASE64Encoder().encode(enc);
System.out.println(md5Sum);

MSSQLコード(「SC0RfYWqWLK / YNpIDdGi8w ==」を返します)

DECLARE @Str nvarchar(200)
SET @Str = N'chinese lorem ipsum 槏殟殠巘斖蘱飣偓啅撱簻臗'
DECLARE @Bin varbinary(max)
SET @Bin = HashBytes('MD5', @Str);
DECLARE @Hash char(24)
SET @Hash = CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@Bin"))', 'NVARCHAR(MAX)')
PRINT @Hash

Obj-Cコード( "vZRPxuE84whftlx697i / Ig =="を返します)

NSString *input = @"chinese lorem ipsum 槏殟殠巘斖蘱飣偓啅撱簻臗";
NSData *data = [input dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:NO];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(data.bytes, data.length, digest);
NSData *hashData = [[NSData alloc] initWithBytes:digest length: sizeof digest];
NSString *base64 = [hashData base64EncodedString];
NSLog(@"%@", base64);

Obj-Cが他の値と同じ値を返すようにするのを手伝っていただけませんか。iOSアプリで実行されます。ありがとう。

4

2 に答える 2

6

ここでは専門家ではありませんが、推測です。文字列からデータを初期化するためにNSUTF16LittleEndianStringEncodingエンコーディングを使用してみましたか?

于 2012-08-09T16:40:14.130 に答える
1

問題は、JavaとMSSQLが文字列の先頭にバイト順マークを追加しないのに対し、dataUsingEncoding:allowLossyConversion:withNSUnicodeStringEncodingが追加することであると思われます。

これは、javaおよびobjective-cの実際のUTF-16データのサイズ(および、問題がないことが判明した場合は実際のコンテンツ)を確認することで確認できます。

于 2012-08-09T14:41:41.663 に答える