这是我的isEqual和hash自定义运算符
- (BOOL)isEqual:(id)object;
{
BGSearchParameter * theOther = (BGSearchParameter *)object;
BOOL isTheOtherEqual;
isTheOtherEqual = isTheOtherEqual && [self.Location isEqual:theOther.Location];
isTheOtherEqual = isTheOtherEqual && [self.keyword isEqual:theOther.keyword];
isTheOtherEqual = isTheOtherEqual && (self.Distance == theOther.Distance);
isTheOtherEqual = isTheOtherEqual && (self.SortByWhat == theOther.SortByWhat);
isTheOtherEqual = isTheOtherEqual && (self.startFrom == theOther.startFrom);
isTheOtherEqual = isTheOtherEqual && (self.numberOfIDstoGrab == theOther.numberOfIDstoGrab);
return isTheOtherEqual;
}
- (NSUInteger)hash
{
NSUInteger returnValue=0;
returnValue ^= self.Location.hash;
returnValue ^= self.keyword.hash;
return returnValue;
}
那个人完成了这项工作。但是,假设我想将距离和startfrom合并到散列中。
我想我只想添加:
returnValue ^= self.Distance;
这是一个错误,因为它不兼容。
那我该怎么做呢?
答案 0 :(得分:4)
我最终将数字转换为NSNumber并得到了哈希:
returnValue ^= @(self.Distance).hash;
returnValue ^= @(self.SortByWhat).hash;
returnValue ^= @(self.startFrom).hash;
returnValue ^= @(self.numberOfIDstoGrab).hash;
马丁答案很好。但是,结果应该是相同的,我不想实现另一个复杂的功能。
答案 1 :(得分:2)
这是CFNumber
/ NSNumber
用作float
和double
值的哈希值的内容,请参阅Mac OS X 10.7.5中的示例ForFoundationOnly.h源。
#define HASHFACTOR 2654435761U
CF_INLINE CFHashCode _CFHashDouble(double d) {
double dInt;
if (d < 0) d = -d;
dInt = floor(d+0.5);
CFHashCode integralHash = HASHFACTOR * (CFHashCode)fmod(dInt, (double)ULONG_MAX);
return (CFHashCode)(integralHash + (CFHashCode)((d - dInt) * ULONG_MAX));
}
CFHashCode
定义为
typedef unsigned long CFHashCode;
答案 2 :(得分:-1)
试试这个:
static NSUInteger doubleHash(float value) {
return *(NSUInteger *)&value;//gets bits
}
注意转换为float。它会降低精度,但sizeof(float)== sizeof(NSUInteger)。