Algorithm: 해시(Hash)

감자전·2024년 9월 11일
0

해시(Hash)란?

데이터를 고정된 크기의 값으로 변환하여 저장하고 검색하는 알고리즘이다.
이러한 해시는 데이터를 해시 함수(Hash Function)를 사용해 고정된 크기의 해시 값으로 변환하는 것이 핵심이다.
변환된 값은 해시 테이블(Hash Table) 이라는 자료구조에 저장된다.

해시 함수(Hash Function)

입력값(데이터)을 받아 고정된 크기의 해시 값으로 변환하는 함수이대. 이 "때 출력 값은 일반적으로 숫자로 변환되며, 이 숫자는 데이터가 저장될 위치를 나타내는 인덱스로 사용된다. 데이터를 빠르게 찾기 위한 목적으로 사용된다.

해시맵(HashMap)과 해시테이블(HashTable)

해시맵과 해시테이블은 해시 함수의 원리를 이용해 데이터를 저장하는 키-값 쌍(key-value pair)자료구조이다. 이 두 개념에는 몇 가지 차이점이 있다.

2. 해시테이블(HashTable)

해시맵과 유사하게 데이터를 키-값 쌍으로 저장하지만, 주로 멀티스레드 환경에서 사용되며 동기화 기능을 포함하고 있다. 특히 동시성을 고려하는 환경에서 데이터의 무결성을 보장한다.

특징
1. 해시테이블은 멀티스레드 환경에서 데이터의 충돌을 방지하기 위해 락(lock) 매커니즘을 사용해 동시 접근을 제어합니다.

해시의 종류

1. 단순 해시(Simple Hash)

입력데이터를 고정된 범위의 숫자로 변환하는 기본적이 해시 함수이다. 예를 들어, 각 문자의 ASCII 값을 더해 특정 범위로 나누는 방식이 있다.

function simpleHash(str) {
  let hash = 0;
  for (let i = 0; i < str.length; i++) {
    hash += str.charCodeAt(i); // 각 문자의 ASCII 값을 더함
  }
  return hash % 1000; // 고정된 범위로 나누기
}

console.log(simpleHash("hello")); ///532

2. 해시맵(Hash Map)

자바스크립트에서 해시맵은 객체(Object) 또는 Map으로 구현할 수 있다. 해시맵은 해시 함수를 이용해 데이터를 특정 인덱스에 키-값 쌍으로 저장하여 빠르게 데이터에 접근할 수 있다. 자바스크립트에서 객체(Object)나 Map은 해시맵과 비슷한 역할을 한다.

특징
1. 키는 유일해야하고 중복이 불가능하다
2. 값은 중복될 수 있다.
3. 키를 해시 함수로 해시 값으로 변환한 후 그 값을 인덱스로 사용해 데이터를 저장한다.
4. 해시맵은 동기화되지 않아 비동기적 환경에서 데이터를 안전하게 관리하려면 별도의 조치가 필요하다
5. 해시맵의 검색, 삽입, 삭제는 평균적으로 O(1)의 시간복잡도를 가져 빠른 데이터 접근이 가능하다.

const hashMap = {};

hashMap["name"] = "John";
hashMap["age"] = 30;

console.log(hashMap["name"]); // John
console.log(hashMap["age"]); // 30
const map = new Map();
map.set('key1','value1');
map.set('key2','value2');

console.log(map.get('key1')); //'value1'

3. SHA-256 (암호화 해시)

SHA-256은 보안과 암호화에 많이 사용되는 해시 함수로 주로 암호화된 데이터를 비교하거나 비밀번호 검증 등에 사용된다
JavaScript에서는 crypto 모듈을 사용하거나, 브라우저 환경에서 Web Crypto API를 사용해 구현할 수 있다.

async function sha256(message) {
    const msgBuffer = new TextEncoder().encode(message);
    const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
    return hashHex;
}

sha256("hello").then(hash => console.log(hash)); // SHA-256 해시 값 출력

4. MD5 (Message Digest Algorithm)

MD5는 오래된 해시 함수로, 더 이상 보안 목적으로 권장되지 않지만 해시의 대표적인 예이다.

const CryptoJS = require('crypto-js');

const hash = CryptoJS.MD5("hello").toString();
console.log(hash); // MD5 해시 값 출력
profile
노릇노릇한 프론트엔드 감자전

0개의 댓글

관련 채용 정보