对象的比较 - hash和isEqual

对象的比较

hashisEqual:方法虽然不是严格的内省方法,但是可以发挥类似的作用,是进行对象的识别和比较时不可或缺的运行时工具。它们并不向运行环境查询对象信息,而是依赖于具体类的比较逻辑。

hashisEqual:方法都在NSObject协议中声明,且彼此关系紧密。实现hash方法必须返回一个整型数,作为哈希表结构中的表地址。两个对象相等(isEqual:方法的判断结果)意味着它们有相同的哈希值。如果您的对象可能被包含在象NSSet这样的集合中,则需要定义hash方法,并确保该方法在两个对象相等的时候返回相同的哈希值。NSObject类中缺省的isEqual:实现只是简单地检查指针是否相等。

isEqual:的使用相当直接,它将消息的接收者和通过参数传入的对象进行比较。对象的比较常常可以在运行时决定应该对对象做些什么。如列表2-11所示,您可以通过isEqual:来确定是否执行某一个动作。在这个例子中,动作是指保存被修改了的预置信息。

列表2-11  使用isEqual:方法

- (void)saveDefaults {
    NSDictionary *prefs = [self preferences];
    if (![origValues isEqual:prefs]) 
        [Preferences savePreferencesToDefaults:prefs];
}

如果您正在创建子类,则可能需要重载isEqual:方法,以进一步检查对象是否相等。子类可能定义额外的属性,当两个实例被认为相等时,属性的值必须相同。举例来说,假定您创建一个名为MyWidget的NSObject子类,类中包含两个实例变量:namedata。当MyWidget的两个实例被认为是相等时,这些变量必须具有相同的值。列表2-12显示如何在MyWidget类中实现isEqual:方法。

列表 2-12  重载isEqual:方法

- (BOOL)isEqual:(id)other {
    if (other == self) 
        return YES;
    if (!other || ![other isKindOfClass:[self class]]) 
        return NO;
    return [self isEqualToWidget:other];
}
 
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
    if (self == aWidget) 
        return YES;
    if (![(id)[self name] isEqual:[aWidget name]])
        return NO;
    if (![[self data] isEqualToData:[aWidget data]])
        return NO;
    return YES;
}

isEqual:方法首先检查指针的等同性,然后是类的等同性,最后调用对象的比较器进行比较。比较器的名称指示出参与比较的对象的类名称。这种类型的比较器对传入的对象进行强制类型检查,是Cocoa中常见的约定,NSString的isEqualToString:NSTimeZone的isEqualToTimeZone:就是两个这样的例子。特定类的比较器(在这个例子中是isEqualToWidget:)负责执行name和data变量的等同性。

在Cocoa框架的所有isEqualToType:方法中,nil都不是正当的参数,这些方法的实现在接收到nil参数时会抛出例外。然而为了向后兼容,Cocoa框架中的isEqual:方法可以接收nil值,在这种情况下返回NO

CFB-HASH算法和CBC-Hash算法是两种不同的哈希算法,它们在实现上有一些相似之处,但也有明显的区别。 相似之处: 1. 都是基于块密码的哈希算法:CFB-HASH和CBC-Hash都是使用块密码来实现哈希功能。块密码是一种将固定长度的明文块转换为相同长度的密文块的密码算法。 2. 都具有可逆性:CFB-HASH和CBC-Hash都可以通过相应的解密算法将哈希值还原回原始的明文块。 3. 都具有数据完整性校验功能:CFB-HASH和CBC-Hash都能够校验数据的完整性,即通过对明文块进行哈希计算,然后将哈希值与接收方计算得到的哈希值进行比较,来判断数据是否被篡改。 区别: 1. 工作模式不同:CFB-HASH使用的是加密反馈(CFB)模式,而CBC-Hash使用的是密码块链(CBC)模式。CFB模式是一种自同步的模式,它将前一个密文块的输出作为加密函数的输入,而CBC模式则是将前一个密文块与当前明文块进行异或操作后再进行加密。 2. 密钥使用方式不同:CFB-HASH和CBC-Hash在密钥的使用上也有区别。CFB-HASH使用的是相同的密钥用于加密和解密过程,而CBC-Hash使用的是两个不同的密钥,一个用于加密,一个用于解密。 3. 安全性不同:由于使用不同的工作模式和密钥使用方式,CFB-HASH和CBC-Hash在安全性上也有所差异。一般来说,CBC-Hash相对于CFB-HASH更安全,因为它具有更好的抗差分攻击和抗重放攻击的能力。 总结:CFB-HASH和CBC-Hash是两种不同的哈希算法,它们在工作模式、密钥使用方式和安全性等方面存在明显的区别,但都具有基于块密码的哈希功能和数据完整性校验功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值