Swift 4:Inbuilt String.hashValue为不同的字符串生成相同的结果

时间:2018-04-09 03:25:21

标签: swift

使用Swift的内置字符串hashValue生成哈希值时,我们发现了两个不同的字符串生成相同哈希值的情况......但是碰撞的原因非常复杂..

取这两个字符串:

var str1 = """
00000000000000
00000000000000
00000000000000
00000000000000
00000000000000
00000000100000
00000000000000
00000000000
""" //Contains a single 1 character
var str2 = """
00000000000000
00000000000000
00000000000000
00000000000000
00000000000000
00000000000000
00000000000000
00000000000
""" //Contains only zeroes

str1 == str2 // false
str1.hashValue == str2.hashValue // true ..WAT?
  • 如果我们用单个字符修剪两个字符串,则hashValues 不同
  • 如果我们附加不同的字符,则hashValues 不同
  • 如果我们附加相同的字符,则hashValues为相同

很想明白这里发生了什么......

由于

2 个答案:

答案 0 :(得分:5)

Hashable协议上查看Apple的官方文档。它说:

  

由类型的hashValue属性提供的哈希值是一个整数,对于同等比较的任何两个实例都是相同的。也就是说,对于同一类型的两个ab实例,如果a == b,则为a.hashValue == b.hashValue反之则不然:具有相同哈希值的两个实例不一定彼此相等。

您还可以阅读此post

获取更多信息

答案 1 :(得分:2)

  

不要假设具有相同哈希值的两个项目相同。   发生这种情况是因为您对各个哈希值进行异或但是异或   值本身给出零(A ^ A = 0)。

也许这篇文章会给你答案

https://useyourloaf.com/blog/swift-hashable/

干杯,