【发布时间】:2015-09-14 20:21:21
【问题描述】:
我实现了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 结果 = [self.hashAlgorithm hashValues:@"value1value2" withSalt:@"salt"]; 34 35 // 断言 36
XCTAssertEqual(结果,4989295659699749532); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 } 38
如何在 32 位架构中获得相同的值?
【问题讨论】:
标签: objective-c