我实现了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位架构中获得相同的值?
答案 0 :(得分:1)
NS(U)Integer在32/64位环境中具有不同的类型声明。
从64位转换指南
这些变化中最值得注意的是NSInteger和NSUInteger(Cocoa数据类型)在64位环境中是64位,在32位环境中是32位。
要在两种环境中获得相同的结果,请使用固定尺寸,例如uint32_t
或uint64_t