Hash

김재형·2024년 8월 17일
0
post-custom-banner

들어가기에 앞서

면접에서 받았던 질문중 하나였던
"암호화를 해보신 적 있으신가요?"
해당 질문에선 전 아무말도 하지 못했습니다.
그래서 요번엔 Hash에 대해 알아보려고 합니다.

Hashing 은 뭘까요? feat. HashCode

해시 알고리듬으로 임의 크기를 가진 데이터를 고정된 크기,(길이) 고유한 값으로 만드는 것을 말합니다.
다양한 해시 알고리즘이 존재하며 ( SHA-1, SHA-2, MD5 등)

고유한 값을 -> 해시 밸류 혹은 해시 값이라고 합니다.
만약 프로그래밍 언어에서 객체를 식별하기위한 값은 해시 값이 아닌 Hash Code 라고 합니다.

Hashable

갹체에 해쉬 코드를 생성할 수 있는 기능을 제공하는 프로토콜로,
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)
    }
}

String 과 Int

놀랍게도 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 을 통해 이를 해결해 보려고 합니다.
모두 고생하셨습니당~

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글