iOS哈希简单应用
程序员文章站
2022-07-03 16:54:09
iOS 哈希算法简单运用直接上代码定义的UserModel@interface UserModel : NSObject- (instancetype)initWithID:(NSInteger)uid name:(NSString *)name;@property(nonatomic,strong)NSString *name;@property(nonatomic, assign)NSInteger uid;@end@implementation UserModel- (inst...
iOS 哈希算法简单运用
直接上代码
定义的UserModel
@interface UserModel : NSObject
- (instancetype)initWithID:(NSInteger)uid name:(NSString *)name;
@property(nonatomic,strong)NSString *name;
@property(nonatomic, assign)NSInteger uid;
@end
@implementation UserModel
- (instancetype)initWithID:(NSInteger)uid name:(NSString *)name
{
self = [super init];
if (self) {
self.uid = uid;
self.name = name;
}
return self;
}
//针对每个属性的hash值进行异或运算作为 hash值
-(NSUInteger)hash
{
NSUInteger hash = [self.name hash] ^ self.uid;
NSLog(@"hash = %ld", hash);
return hash;
}
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[UserModel class]]) {
return NO;
}
return [self isEqualToUserModel:(UserModel *)object];
}
- (BOOL)isEqualToUserModel:(UserModel *)userModel {
if (!userModel) {
return NO;
}
BOOL haveEqualNames = (!self.name && !userModel.name) || [self.name isEqualToString:userModel.name];
BOOL haveEqualBirthdays = (!self.uid && !userModel.uid) || (self.uid == userModel.uid);
return haveEqualNames && haveEqualBirthdays;
}
@end
ViewController
//对象类型hash 对比
/*
isEqual 判断两个对象是否相等
==
针对 基本类型 比较的是值
针对 对象类型 比较的是对象的地址,即是否为同一对象
*/
NSString *str1 = @"你好";
NSString *str2 = @"你好";
if(str1.hash == str2.hash){
NSLog(@"==");
}
NSLog(@"str1 isEqual str2 比较结果:%@",[str1 isEqual:str2] ? @"YES" : @"NO");
//针对自定义对象的比较
/*
1.定义UserModel类
重写 isEqual 方法 如果直接返回YES 对比的两个值无论是否一样 返回的结果一直是 YES
*/
UserModel *user1 = [[UserModel alloc] initWithID:1 name:@"张三"];
UserModel *user2 = [[UserModel alloc] initWithID:1 name:@"张三"];
if([user1 isEqual:user2]){
NSLog(@"user1 isEqual user2 比较结果:%@",[user1 isEqual:user2] ? @"YES" : @"NO");
}
/*
2.重写hash方法
hash方法只在对象被添加至NSSet和设置为NSDictionary的key时会调用
*/
NSMutableArray *array1 = [NSMutableArray array];
[array1 addObject:user1];
NSMutableArray *array2 = [NSMutableArray array];
[array2 addObject:user2];
NSLog(@"array end -------------------------------");
NSMutableSet *set1 = [NSMutableSet set];
[set1 addObject:user1];
[set1 addObject:user2];
NSMutableSet *set2 = [NSMutableSet set];
[set2 addObject:user2];
NSLog(@"--------set end--------");
NSMutableDictionary *dictionaryValue1 = [NSMutableDictionary dictionary];
[dictionaryValue1 setObject:user1 forKey:@"KEY1"];
NSMutableDictionary *dictionaryValue2 = [NSMutableDictionary dictionary];
[dictionaryValue2 setObject:user2 forKey:@"KEY2"];
NSLog(@"--------dictionary value--------");
//只为验证效果 会crash 验证须打开
// NSMutableDictionary *dictionaryKey1 = [NSMutableDictionary dictionary];
// [dictionaryKey1 setObject:@"1" forKey:user1];
// NSMutableDictionary *dictionaryKey2 = [NSMutableDictionary dictionary];
// [dictionaryKey2 setObject:@"2" forKey:user2];
// NSLog(@"--------dictionary key--------");
/*
3.重写hash方法 ---注意点
用到的地方:去重自定义对象---(妙用 hash值唯一性的特点)
对象相同 hash值一定相等
hash值相等 对象不一定相同
so:
hash值是对象判等的必要非充分条件
*/
/*
直接重写
- (NSUInteger)hash {
return [super hash]; //返回的是该对象的内存地址
}
带来的问题 使用Set 去重的时候 Set 中会插入 user1 和 user2
//正确写法
-(NSUInteger)hash
{
NSUInteger hash = [self.name hash] ^ self.uid;
NSLog(@"hash = %ld", hash);
return hash;
}
*/
tips
哈希(Hash)或者说散列表,它是一种基础数据结构。Hash 表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,但它又是是数组和链表的基础上演化而来,既具有数组的有点,又具有链表的有点。能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。应用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。
本文地址:https://blog.csdn.net/MHTios/article/details/109367607