欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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