면접에서 받았던 질문중 하나였던
"암호화를 해보신 적 있으신가요?"
해당 질문에선 전 아무말도 하지 못했습니다.
그래서 요번엔 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을 통해 이를 해결해 보려고 합니다.
모두 고생하셨습니당~