Swift에서 기본적으로 무작위 화없이 구조체를 해시 할 수 있습니까?
struct Kiwi: Hashable {
let userId: String
let selections: Set<Int>
init(userId: String, selections: Set<Int>) {
self.userId = userId
self.selections = selections
}
func hash(into hasher: inout Hasher) {
hasher.combine(userId)
hasher.combine(selections)
}
}
let k1 = Kiwi(userId: "u1", selections: [1])
print(k1.hashValue)
let k2 = Kiwi(userId: "u1", selections: [1])
print(k2.hashValue)
이러한 해시 값은 다른 실행 지점에서 동일하다고 보장되지 않습니다 (해싱 함수의 무작위 화로 인해). 이 해시의 목적은 단순히 구조체 값의 서명을 생성하여 구조체 값이 실행되는시기에 관계없이 동일하면 항상 동일하도록하는 것입니다.
당분간 저는 구조체를 Equatable
만들고 구조체 인스턴스를 비교했지만 대신 "서명"(즉, 해시)을 비교할 수 있기를 원합니다.
다음과 같은 고유 한 프로토콜을 만들어야합니다.
protocol Signable {
/// A signature that's stable across app launches
var signature: Signature { get }
}
Equatable
/ Hashable
는 매우 구체적인 의미를 가진 표준 프로토콜입니다 (Equality는 대체 가능성을 의미하고 Hashability는 성능 최적화로 휴리스틱입니다 Equatable
). 동등성 검사 또는 해싱과 모호하게 유사한 모든 구문을 포괄하는 구문이 아닙니다.
또한 조심하십시오 무작위 시드 행동 의가 Hasher
있다 의도적 . 해시 넘치는 DoS 공격 으로부터 사용자를 보호합니다 . 이 벡터에 자신을 노출 할 것이기 때문에 이것을 우회하는 데 매우주의해야합니다.
signature
앱 실행시 지속되는 인스턴스를 비교하는 데 사용 하는 것이 좋습니다. 그러나 선형 시간 조회로 퇴화하기 위해 공격받을 수있는 해시 된 데이터 구조를 구현하는 데 사용 하지 않는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다