同一对象的哈希值不同,Swift,Hashable

Tab*_*asa 3 hash ios swift

里面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)

Mar*_*n R 6

Swift 4.2 中强制执行了哈希随机化,并实施了SE 0206 Hashable 增强功能。来自提案:

然而,即使输入完全相同的字节序列,Hasher 也可能在其他执行中生成完全不同的哈希值。这种随机化是一个关键功能,因为它使潜在攻击者更难预测哈希值。Hashable 一直被记录为明确允许这种不确定性。

此外,它允许在 Swift 标准库中更改(例如改进)实际实现,而不会破坏兼容性。

出于调试目的,可以通过将 SWIFT_DETERMINISTIC_HASHING 环境变量定义为值 1 来禁用哈希随机化。

Swift 标准哈希器的实现可以在开源存储库中找到:

它基于SipHash