里面Hashable我们可以看到:
/// Hash values are not guaranteed to be equal across different executions of
/// your program. Do not save hash values to use during a future execution.
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?每次运行时为同一对象获取不同的哈希值让我感到困惑,因为在大学里我研究了hash function为同一对象返回相同值的方法。Apple 使用什么算法进行哈希?
EG(这将在每次运行时打印不同的值)
struct HashTesting: Hashable {
var a = 10
var b = 20
var str = "str"
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let obj = HashTesting(a: 10, b: 10, str: "str")
print("\(obj.hashValue)")
}
}
Run Code Online (Sandbox Code Playgroud)
Swift 4.2 中强制执行了哈希随机化,并实施了SE 0206 Hashable 增强功能。来自提案:
然而,即使输入完全相同的字节序列,Hasher 也可能在其他执行中生成完全不同的哈希值。这种随机化是一个关键功能,因为它使潜在攻击者更难预测哈希值。Hashable 一直被记录为明确允许这种不确定性。
此外,它允许在 Swift 标准库中更改(例如改进)实际实现,而不会破坏兼容性。
出于调试目的,可以通过将 SWIFT_DETERMINISTIC_HASHING 环境变量定义为值 1 来禁用哈希随机化。
Swift 标准哈希器的实现可以在开源存储库中找到:
它基于SipHash。
| 归档时间: |
|
| 查看次数: |
1276 次 |
| 最近记录: |