면접에서 받았던 질문중 하나였던
"암호화를 해보신 적 있으신가요?"
해당 질문에선 전 아무말도 하지 못했습니다.
그래서 요번엔 Hash에 대해 알아보려고 합니다.
해시 알고리듬으로 임의 크기를 가진 데이터를 고정된 크기,(길이) 고유한 값으로 만드는 것을 말합니다.
다양한 해시 알고리즘이 존재하며 ( SHA-1, SHA-2, MD5 등)
고유한 값을 ->
해시 밸류 혹은 해시 값
이라고 합니다.
만약 프로그래밍 언어에서 객체를 식별하기위한 값은 해시 값이 아닌Hash Code
라고 합니다.
갹체에 해쉬 코드를 생성할 수 있는 기능을 제공하는 프로토콜로,
Dictionary
,Set
애서 객체를 고유하고, 저장하고 검색하는데 사용합니다.
Equatable
프로코롤을 상속받아 구현되며(두 객체가 같니?) 두 객체가 동일하다면 해시코드도
동일합니다.
struct Person: Hashable {
let name: String
let age: Int
// Equatable 은 자동 구현됩니다.
// Hashable도 자동으로 구현됩니다만, 커스텀시 직접 구현 가능합니다.
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(age)
}
}
놀랍게도 Swift 문자열 즉
Sting, Int
는 Hashable을 채택하고 있습니다.
func hashItem(item: String) -> Int {
var hasher = Hasher()
item.hash(into: &hasher)
print("문자열 해시값",item.hashValue) // 사용자제
print("문자열 해시",item.hash)
return hasher.finalize()
}
let hashvalue = hashItem(item: "테스트")
let hashvalue2 = hashItem(item: "테스트")
print("문자열 해시 값1", hashvalue)
print("문자열 해시 값2", hashvalue2)
/*
문자열 해시값 -1247039767080252612
문자열 해시 32424200451
문자열 해시값 -1247039767080252612
문자열 해시 32424200451
문자열 해시 값1 -1247039767080252612
문자열 해시 값2 -1247039767080252612
*/
위의 코드는 문자열을 받고
해당 문자열을Hasher
라는 구조체(해시 값을 계산하기위한)를 통해 해시코드를 생성합니다.
다만 매 실행 때마다 동일하게 나오지 않습니다.
즉, 해당 값을 저장할수가 없다는것이죠/// The hash value. /// /// 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. /// /// - Important: `hashValue` is deprecated as a `Hashable` requirement. To /// conform to `Hashable`, implement the `hash(into:)` requirement instead. /// The compiler provides an implementation for `hashValue` for you.
/// 중요: `hashValue`은 `Hashable` 요구사항으로 더 이상 사용되지 않습니다.
/// 해시 가능`을 준수하려면 대신 `hash(into:)` 요구 사항을 구현하세요.
/// 컴파일러는 `hashValue`에 대한 구현을 제공합니다.
자 마지막에 매번 실행때마다 해시값이 바뀌는 문제가 발생하였습니다.
Hasher 구조체는 매번 다른 난수를 통해 해시 값을 계산하여, 결과가 달라지게 되는데
이를 해결하기위해 고정된 해시 함수를 사용하여야 합니다.
다음 시간에는CryptoKit
을 통해 이를 해결해 보려고 합니다.
모두 고생하셨습니당~