0

当我使用此代码在我的 iPhone 应用程序中生成 hash256 时:

 unsigned char hashedChars[32];
  NSString *inputString;
  inputString = [NSString stringWithFormat:@"hello"];
  CC_SHA256([inputString UTF8String],
      [inputString lengthOfBytesUsingEncoding:NSASCIIStringEncoding ], 
      hashedChars);
  NSData * hashedData = [NSData dataWithBytes:hashedChars length:32];

inputString 的 hash256 是正确创建的,但是如果我使用这样的字符串 @"\x00\x25\x53\b4",则 hash256 与带有 "\x" 字符的真实字符串不同。我认为问题在于编码“UTF8”而不是ascii。谢谢!

4

2 回答 2

1

你得到的是字节,[inputString UTF8String]但长度是[inputString lengthOfBytesUsingEncoding:NSASCIIStringEncoding]. 这显然是错误的。此外(假设您的意思是“\xB4”并且它变成了不是 ASCII 的东西),“\xB4”不太可能是 ASCII。NSString 的文档说

如果指定的编码不能用于转换接收者,则返回 0

所以你正在计算空字符串的哈希值。当然是错的。

如果您只生成一次数据,则不太可能出现问题:

NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA256(inputData.bytes, inputData.length, hashedChars);
于 2010-09-13T01:37:48.647 回答
1

我会怀疑第一个字符“\x00”——这将终止任何认为它处理“常规 C 字符串”的东西。

不确定 lengthOfBytesUsingEncoding: 是否考虑了这些东西,但我会尝试使用它。

于 2010-09-12T23:20:16.727 回答