1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift Collections open source project
//
// Copyright (c) 2022 - 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
//
//===----------------------------------------------------------------------===//
/// A type with manually controlled hash values, for easy testing of collision
/// scenarios.
struct Collider:
Hashable, CustomStringConvertible, CustomDebugStringConvertible
{
var identity: Int
var hash: Hash
init(_ identity: Int, _ hash: Hash) {
self.identity = identity
self.hash = hash
}
init(_ identity: Int) {
self.identity = identity
self.hash = Hash(identity)
}
init(_ identity: String) {
self.hash = Hash(identity)!
self.identity = hash.value
}
static func ==(left: Self, right: Self) -> Bool {
guard left.identity == right.identity else { return false }
precondition(left.hash == right.hash)
return true
}
func hash(into hasher: inout Hasher) {
hasher.combine(hash.value)
}
var description: String {
"\(identity)(#\(hash))"
}
var debugDescription: String {
description
}
}
/// A type with precisely controlled hash values. This can be used to set up
/// hash tables with fully deterministic contents.
struct RawCollider:
Hashable, CustomStringConvertible
{
var identity: Int
var hash: Hash
init(_ identity: Int, _ hash: Hash) {
self.identity = identity
self.hash = hash
}
init(_ identity: Int) {
self.identity = identity
self.hash = Hash(identity)
}
init(_ identity: String) {
self.hash = Hash(identity)!
self.identity = hash.value
}
static func ==(left: Self, right: Self) -> Bool {
guard left.identity == right.identity else { return false }
precondition(left.hash == right.hash)
return true
}
var hashValue: Int {
fatalError("Don't")
}
func hash(into hasher: inout Hasher) {
fatalError("Don't")
}
func _rawHashValue(seed: Int) -> Int {
hash.value
}
var description: String {
"\(identity)#\(hash)"
}
}
|