NSUInteger采用64位和32位架构

时间:2015-09-14 20:21:21

标签: objective-c

我实现了FNV1a哈希算法,如下所示:

#import "SWBHashAlgorithm.h"

@implementation SWBHashAlgorithm
- (NSUInteger)hashValues:(NSString *)values withSalt:(NSString *)salt {
    const NSUInteger FnvPrime = 16777619;
    const NSUInteger FnvOffsetBasis = 2166136261;

    NSMutableString *input = [[NSMutableString alloc]init];
    [input appendString:values];
    if (salt != nil && ![salt isEqual:[NSNull null]]) {
        [input appendString:salt];
    }
    NSUInteger hash = FnvOffsetBasis;

    for (NSInteger i = 0; i != [input length]; ++i) {
        hash = (hash ^ [input characterAtIndex:i]) * FnvPrime;
    }
    return hash;
}

@end

在x86_64架构上,我的单​​元测试通过:

- (void)testSomeData {
    // Arrange

    // Act
    NSUInteger result = [self.hashAlgorithm hashValues:@"value1value2" withSalt:@"salt"];

    // Assert
    XCTAssertEqual(result, 4989295659699749532); }

但是在i386上失败是因为:

  

SWBHashAlgorithmTests.m:36 :((结果)等于(4989295659699749532))   失败:(" 3553444508")不等于(" 4989295659699749532"):33
  NSUInteger result = [self.hashAlgorithm hashValues:@" value1value2"   withSalt:@"盐"]; 34 35 //断言36
  XCTAssertEqual(结果,4989295659699749532);          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >

如何在32位架构中获得相同的值?

1 个答案:

答案 0 :(得分:1)

NS(U)Integer在32/64位环境中具有不同的类型声明。

从64位转换指南

  

这些变化中最值得注意的是NSInteger和NSUInteger(Cocoa数据类型)在64位环境中是64位,在32位环境中是32位。

要在两种环境中获得相同的结果,请使用固定尺寸,例如uint32_tuint64_t