안녕하세요 !
이번에는 Hashable 이란 주제로 포스팅을 해볼 생각입니다 !
해시값은 데이터를 고정된 크기의 값으로 변환한 것이며(Swift에서 해시값은 64비트 정수로 표현되용)이 변환 과정은 해시 함수를 통해 이루어지며, 해시 함수는 입력 데이터의 크기와 상관없이 항상 동일한 크기의 출력을 생성합니다
해시값의 특징:
- 동일한 입력은 항상 동일한 해시값을 생성한다
- 입력이 조금만 달라져도 완전히 다른 해시값으로 생성된다
- 해시값으로부터 원본 데이터를 유추하는 것은 거의 불가능하다
let greeting = "Hello, Swift!"
print(greeting.hashValue) // 예: -2848629862486
여기서 주의할 점은 해시값이 프로그램을 실행할 때마다 달라질 수 있다는 것입니다
Hashable은 Swift의 프로토콜 중 하나로, 해당 타입의 인스턴스가 해시값을 가질 수 있음을 의미합니다 (Swift의 기본 타입들(String, Int, Double 등)은 모두 Hashable 프로토콜을 준수합니다)
Hashable 프로토콜을 준수하는 타입은 다음 두 가지 요구사항을 만족해야 합니다:
- hashValue 프로퍼티를 가져야 한다
- hash(into:) 메서드를 구현해야 한다
또한, Hashable은 Equatable 프로토콜을 상속받기 때문에, == 연산자도 구현해야 합니다
Hashable은 주로 Set과 Dictionary에서 사용되며 Set의 요소나 Dictionary의 키는 반드시 Hashable해야 합니다
예를 들어, 사용자 정의 구조체를 Set의 요소로 사용하고 싶다면 다음과 같이 Hashable을 준수하도록 만들 수 있습니다:
struct User: Hashable {
let id: Int
let name: String
}
var userSet = Set<User>()
userSet.insert(User(id: 1, name: "Alice"))
userSet.insert(User(id: 2, name: "Bob"))
서로 다른 두 값이 같은 해시값을 가지는 경우를 해시 충돌이라고 하는데 해시 함수의 특성상 피할 수 없는 현상입니다
Hashable과 해시값은 Swift에서 효율적인 데이터 구조를 구현하는 데 중요한 역할을 하며 특히 대량의 데이터를 빠르게 검색하거나 중복을 제거해야 할 때 유용하게 사용되요!
이상으로 포스팅 마무리 하겠습니다.
.
.
.
감사합니다.