해싱(hashing)은 통상적인 반복 비교를 통하지 않고 특정 계산만으로 자료 저장 주소를 찾아내는 탐색 방법을 뜻한다.
키 값을 해시 함수로 계산해 결과값을 주소로 값에 접근하는 방법으로 전자서명, 보안 알고리즘, 해시테이블 생성 시 주로 사용된다.
- 빠르게 자료를 삽입하고 저장하고 불러올 때 유용하다.
- 주어진 키 값을 갖는 레코드를 해시함수로 산출한 주소로 저장위치에 접근한다.
- 모든 원소에 대한 접근이 동일 시간 내에 이뤄진다.
- 검색의 효율성이 낮다.
자료구조에서의 해싱 구현[편집]
자료구조에서 해싱을 구현하는 방법은 다음과 같다.[1]
정적 해싱[편집]
- 정적 해싱(static hashing)은 고정 크기의 배열을 이용한 방법으로 버킷 주소의 집합을 고정하며 현 파일의 크기를 고려해 해시 함수를 결정한다.
- 파일 크기를 예상하여 해시 함수를 결정하며 파일 크기의 증가에 따라 주기적으로 해싱 구조를 재구성한다.
- 구현이 쉽고 간단하나 버킷의 크기를 작게 잡을 경우 해시충돌의 위험성이 따르고, 크게 잡을 경우 메모리가 낭비된다.
- 데이터의 증감에 따라 해싱 구조를 재구성해야 하기 때문에 추가적인 리소스가 필요하며 데이터의 증가에 따라 검색의 효율성이 저하된다.
제산법[편집]
- 제산법(division)은 나머지 연산자를 사용해 인덱스를 계산하는 방법으로, 레코드 키 값을 수치 자료로 간주하여 어떤 양의 정수(대개 해시테이블의 크기)로 나눈 나머지를 홈 주소로 결정하는 간단한 방법이다. 인덱스를 구하는 공식은 이러하다.
키 값 % 전체 버킷의 크기 = 인덱스
- 해시된 주소가 고르게 분포되지 않을 수 있기에 전체 버킷의 크기를 소수로 잡아 성능을 향상시킨다.
- 부하율(Load Factor)은 70~80%가 적당하다.
중간제곱법[편집]
- 중간제곱법(mid-square)은 키 값을 제곱한 뒤, 결과값의 중간 부분에 있는 몇 비트를 선택해 인덱스로 사용한다.
- 제곱된 결과의 중간 비트는 모든 키 값의 모든 문자의 영향을 받으므로 키를 구성하는 일부 문자가 동일해도 결과값이 다를 확률이 높다.
- 홈 주소를 얻기 위해 사용되는 비트 수는 테이블의 크기에 따라 달라지는데, 중간 부분의 자릿수를 n 이라 하면 각 레코드 값들이 가지는 범위인 해시 테이블의 크기는 이 된다.
- 인덱스를 구하기 위해서 사용되는 비트의 수는 전체 버킷의 크기에 따라 달라진다.
폴딩법[편집]
- 폴딩법(folding)은 마지막 부분을 제외한 키를 균등하게 나누고 XOR 연산을 해 인덱스로 이용한다.
- 이동폴딩(Shift Folding) : 마지막을 제외한 모든 부분을 이동해 최하위 비트가 마지막 부분의 자리와 일치하도록 우측 끝을 맞춰 더한 값을 인덱스로 사용한다.
- 경계 폴딩(Boundary Folding) : 키 값을 여러 부분으로 나누고 각 부분의 경계선을 역으로 정렬한 뒤 같은 자리에 위치한 수를 더한 값을 인덱스로 사용한다.
3
|
0
|
1
|
2
|
3
|
0
|
1
|
2
|
3
|
2
|
1
|
3
|
3
|
0
|
P1
|
P2
|
P3
|
P4
|
P5
|
이중폴딩 ==> P1+P2+P3+P4+P5 = 301+230+123+213+30 = 897이 홈주소가 된다.
경계폴딩 ==> P1+P2(역)+P3+P4(역)+P5 = 301+032+123+312+30 = 798이 홈주소가 된다.
숫자분석법[편집]
- 숫자분석법(digit-analysis)은 키를 구성하는 수가 모든 키들 내에서 어떻게 분포되어있는지 조사하고, 고르게 분포되어 있는 자릿 수를 필요량에 따라 선택해 인덱스로 사용한다.
- 파일의 키 값이 정적 파일일 때 유용하지만 수정이 빈번할 시에는 비효율적이다.
예) 해시 테이블의 크기 = 1000, 홈 주소: 0~999까지(3자리 필요) 레코드 키 값이 다음의 (a)와 같을 때 숫자 분석법을 이용하여 각 키들에 대한 홈 주소를 결정하시오.
(레코드 키 값) (각 키의 홈 주소)
012 - 452 - 0236 ==> 426
012 - 153 - 0530 ==> 150
015 - 342 - 0935 ==> 395
012 - 752 - 1032 ==> 702
012 - 852 - 0470 ==> 840
012 - 543 - 0231 ==> 512
(1) (a)에서 왼족 3자리는 거의 같으므로 제거
(2) 왼쪽 5열, 6열, 7열, 9열 역시 동일 숫자가 많이 분포하므로 무시
(3) 비교적 고른 숫자 분포를 가진 4열, 8열, 10열을 선택하여 주소로 사용
기수변환법[편집]
- 기수변환법(radix-exchange)은 진법으로 변환된 키를 다른 진법으로 간주하고 키를 변환해 인덱스를 얻는다.
- 배열의 크기가 10의 거듭제곱으로 표현되어 변환된 인덱스가 배열의 크기를 초과할 시, 인덱스의 최하위 자리부터 배열의 크기가 허용하는 자릿수만큼 취해 인덱스로 사용한다.
예) 해시 테이블의 크기 = 100000
십진수로 입력된 키 값(B2538) 10을 16진수로 간주하여 그 값을 다시 10진수로 계산하는 기수 변환법을 이용하여 홈 주소를 구하시오.
홈 주소 = 4728(레코드의 주소값에서 해시 테이블이 허용하는 하위 4자리를 선택한다)
무작위 방법[편집]
- 무작위 방법(pseudo-random)은 난수생성기를 사용해 난수를 만들어 인덱스를 결정한다.
- 난수는 1보다 작은 양의 실수로 산출되므로 배열의 크기를 난수에 곱해 사용하며 해시 충돌 시 그 다음 난수를 인덱스로 사용한다.
동적 해싱[편집]
- 동적 해싱(daynamic hashing)은 데이터의 증감에 따라 배열의 크기를 동적으로 변화시키며 오버플로우 발생 시 테이블의 크기를 2배수로 확장한다. 분할할 시 해시된 키의 다음 유효 비트가 0인 키를 한 버킷에 두고, 1인 키를 다른 버킷에 둔다.
- 버킷의 수를 유동적으로 관리하며 해싱된 키를 인덱스로 사용하는 이진 트리를 동적으로 변환하여 사용한다.
- 데이터에 증감에 따라 버킷을 쪼개거나 합치고 버킷을 포인터로 가리키는 인덱스 테이블을 생성/유지해야 한다. 이때 부하가 발생할 수 있다.
- 다중 레벨 인덱스를 관리하며 로직이 복잡하다.
- 데이터가 증가해도 검색의 성능이 유지되며 메모리의 낭비가 적다.
- 접근 시간을 일정하게 유지해야할 수 있다.
확장해싱[편집]
- 확장해싱(extendible hashing)은 트리의 깊이가 2이며 일부 비트열만을 사용하고 버킷이 더 필요할 시 비트열을 하나씩 추가한다.
- 이진수 표현을 기반으로 하며 데이터 수에 따라 버킷의 수가 변한다.
- 2d개의 인덱스를 갖는 배열이며 해시된 키의 처음 d개 비트를 디렉터리 배열의 인덱스 값으로 정하는데 사용한다.
- 처음 d'개의 비트 값이 갖는 키가 하나의 버킷에 저장되며 여러 디렉터리 엔트리가 같은 인덱스를 유지하고 각 버킷 내의 해시된 키가 기반으로 하는 비트의 수 d'를 지역 깊이라고 한다.
- d'와 전역 깊이 d가 같은 버킷에서 오버플로우 날 경우 디렉터리 배열 내의 엔트리 수는 2배가 되며, 어떤 키를 삭제한 뒤 모든 버킷이 d>d'인 경우 엔트리 수는 절반이 된다.
- 대부분의 키 검색은 디렉터리와 버킷에 대한 블록 접근을 필욯로 한다.
- 장점
- 파일의 크기가 크더라도 레코드를 접근하기 위해 디스크 접근이 두 번을 넘기지 않는다.
- 인덱스의 크기가 작아 메모리를 절약할 수 있다.
- 단점
- 각각의 인덱스가 실제의 버킷을 포인트하므로 데이터의 숫자가 적으면 되려 디스크가 낭비된다.
- 버킷을 인덱스를 통해 간접적으로 검색하므로 추가적인 검색이 필요하다.
보안 분야에서의 해싱[편집]
보안(security) 분야에서의 해싱은 데이터 무결성, 메시지 인증에 사용된다. 임의의 길이의 비트열을 입력 받고 고정된 길이의 해시 코드를 생성해 암호학적으로 풀 수 없는 키를 만들어낸다. 위변조를 막기 위한 전자 서명이나 부인 방지를 위해 사용되며 그 예시로는 MD4, MD5, RIPEMD, SHA 등이 있다.
- ↑ 개발자 카니, 〈해싱〉, 《티스토리》, 2018-02-05
참고자료[편집]
- 개발자 카니, 〈해싱〉, 《티스토리》, 2018-02-05
같이 보기[편집]
이 해싱 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.
|
블록체인 : 블록체인 기술 □■⊕, 합의 알고리즘, 암호 알고리즘, 알고리즘, 블록체인 플랫폼, 블록체인 솔루션, 블록체인 서비스
|
|
블록체인 기술
|
Bech32 • BTP • DRC-20 • EIP • IPFS • KRC-20 • NFT 마켓플레이스 • P2P • P2PKH • P2SH • PFP • PUF • SPV • TPS • TRC-20 • UTXO • 가나슈 • 가명성 • 가스 • 가십 • 가십 프로토콜 • 개념증명(PoC) • 검증가능지연함수(VDF) • 게스 • 고스트 프로토콜 • 공공예산 • 글로벌신뢰인공지능 • 대체가능토큰 • 대체불가토큰(NFT) • 도지더리움 브릿지 • 디지털 자산 • 디지털 희소성 • 라운드 • 라운드 로빈 • 라이트하우스 • 랜덤 • 레그테크 • 레이든 • 리카르디안 계약 • 린스타트업 • 마스터키 • 마스트 • 메인넷 • 멜팅 • 믹싱 • 민팅 • 밈블윔블 • 반감기 • 베타넷 • 변경불가성 • 브릿지 • 블록체인 생태계 • 블록체인 클라우드 서비스(BaaS) • 블룸필터 • 비블록체인 • 비앱 • 비콘체인 • 비트코인코어 • 빤통경제 • 수정 고스트 프로토콜 • 스냅샷 • 스마트 계약 • 스마트 브리지 • 스웜프로토콜 • 스크립트퍼브키 • 스테이킹 • 스텔스 주소 • 스핀오프코인 • 슬래싱 • 시크릿 컨트랙트 • 심플 컨트랙트 • 아토믹스왑 • 암호경제(크립토 이코노미) • 앤드어스체인인공지능 • 앵커링 • 언스테이킹 • 에어드랍 • 에폭 • 오프체인 오더락 • 오피리턴 • 옵코드 • 원토큰 문제 • 웨이 • 위스퍼 프로토콜 • 위임 • 유니스왑 • 유동성 • 이더리움 가상머신(EVM) • 이더리움 클라이언트 • 이중지불 • 익명성 • 인증된 익명 아이디 • 인터레저 프로토콜(ILP) • 자산화 • 잠금 스크립트 • 최소기능제품(MVP) • 컨소시엄 블록체인 • 컬러드코인 • 코인셔플 • 코인소각 • 코인에이지 • 코인조인 • 코인토싱 • 크립토노트 • 키스토어 • 타임락 • 테스트넷 • 토다 • 토큰 이코노미 • 토큰화 • 튜링완전 • 튜링불완전 • 트랜잭션 아이디(TxID) • 트러스트 컨트랙트 • 트루빗 • 트릴레마 • 파워 • 파티셔닝 • 퍼블릭 블록체인 • 페널티 • 프라이버시 • 프라이빗 블록체인 • 플랫폼 • 플러딩 • 피어 • 피투피(P2P) • 하이브리드 블록체인 • 합의 • 해시락 • 해시타임락(HTLC) • 해제 스크립트 • 확장성
|
|
해시
|
레인보우 테이블 • 매핑 • 머클경로 • 머클루트 • 머클트리 • 분산해시테이블(DHT) • 블록해시 • 스큐드 머클트리 • 온라인툴즈 • 이전블록해시 • 카뎀리아 • 해시 • 해시레이트 • 해시맵 • 해시충돌 • 해시테이블 • 해시파워 • 해시함수 • 해싱
|
|
블록
|
고아블록 • 그래핀 • 논스 • 마이크로블록 • 베이킹 • 북키퍼 • 브랜치블록 • 브로드캐스팅 • 블록 • 블록높이 • 블록바디 • 블록생성자 • 블록정보 • 블록타임 • 블록헤더 • 비츠 • 세그윗 • 엉클블록 • 완결성 • 제네시스블록 • 타임스탬프 • 프룻 • 프룻체인
|
|
체인
|
더블체인 • 라이트닝 네트워크 • 라이트닝 루프 • 루트체인 • 루프체인 • 메인체인 • 방향성 비순환 그래프(DAG) • 베리파이어블 프루닝 • 블록격자 • 블록체인 • 사용자 활성화 소프트포크(UASF) • 사용자 활성화 하드포크(UAHF) • 사이드체인 • 서브체인 • 소프트포크 • 오페라체인 • 오프체인 • 온체인 • 인터체인 • 차일드체인 • 체인 • 탱글 • 테스트체인 • 토카막 네트워크 • 포크 • 포크체인 • 퓨어체인 • 프로덕트체인 • 프루닝 • 프리포크 • 플라즈마 알고리즘 • 플라즈마캐시 • 플래시 계층 • 하드포크 • 해시그래프 • 홀로체인
|
|
노드
|
검증인(밸리데이터) • 기본노드 • 노드 • 라이트노드 • 랜덤노드 • 마스터노드 • 베이킹노드 • 보조노드 • 보증노드 • 슈퍼노드(슈퍼대표, 대표노드) • 슬롯 • 슬롯리더 • 엔드포인트노드(레인저노드) • 의회 네트워크 • 작업노드 • 종단노드 • 종자노드(시드노드) • 중계노드 • 지갑노드 • 채굴노드(마이닝노드) • 쿼럼 • 풀노드 • 합의노드
|
|
샤딩
|
네트워크 샤딩 • 데이터베이스 샤딩 • 동적샤딩 • 샤드 • 샤딩 • 스테이트 샤딩 • 알고리즘 샤딩 • 적응형 상태 샤딩 • 체인샤딩 • 트랜잭션 샤딩
|
|
채굴
|
병합채굴 • 사전채굴 • 에이식(ASIC) • 에이식부스트 • 에이식 저항 • 일드파밍 • 채굴 • 채굴 난이도 • 채굴량 • 탄소감축채굴 • 페어런치
|
|
탈중앙화
|
TVL • 거버넌스 • 게임파이 • 다오(DAO) • 다이코(DAICO) • 닥(DAC) • 닥스(DAX) • 덱스(DEX) • 디앱(DApp) • 디지오(DGO) • 디튜브 • 디파이(DeFi) • 분산경제 • 분산원장(DLT) • 분산 클라우드 • 소셜파이 • 씨파이(C-Fi) • 오프체인 거버넌스 • 온체인 거버넌스 • 원장 • 준중앙화 • 중앙화 • 탈중앙화 • 탈중앙화 TPS • 탈중앙화 조직(DO) • 탈중앙화 지수(DQ)
|
|
분산아이디
|
DIDs • IETF • ToIP • 검증가능한 자격증명 • 검증인 • 디지털아이덴티티재단 • 발급자 • 보유자 • 분산아이디(DID) • 분산아이디 기관 • 분산아이디 인증(DID Auth) • 아이온 • 자기주권 • 자기주권신원 • 최소화된 자격증명 데이터 • 탈중앙화 키관리시스템 • 통합해석기
|
|
오라클
|
상호인증 블록체인 • 오라클 • 오라클 머신 • 오라클 문제 • 오라클 서비스 • 중간자
|
|
BIP
|
BIP • BIP9 • BIP16 • BIP32 • BIP39 • BIP43 • BIP44 • BIP47 • BIP49 • BIP63 • BIP70 • BIP84 • BIP141 • BIP148
|
|
ERC
|
ERC • ERC-20 • ERC-165 • ERC-223 • ERC-621 • ERC-721 • ERC-777 • ERC-827 • ERC-884 • ERC-998 • ERC-1155 • ERC-1404
|
|
위키 : 자동차, 교통, 지역, 지도, 산업, 기업, 단체, 업무, 생활, 쇼핑, 블록체인, 암호화폐, 인공지능, 개발, 인물, 행사, 일반
|
|
개발 : 프로그래밍, 소프트웨어, 데이터 □■⊕, 솔루션, 보안, 하드웨어, 컴퓨터, 사무자동화, 인터넷, 모바일, 사물인터넷, 게임, 메타버스, 디자인
|
|
데이터
|
ACID • CRUD • CSV • DAO • DB • DBMS • DB 명령어 • DCL • DDL • DML • DTO • ERD • ETL • JDBC • LOD • MDM • ODBC • RDBMS • RDF • SQL • 가상 데이터베이스 • 관계형 데이터베이스 • 그래프 • 기본키(PK) • 내부조인 • 널 • 노드 • 다이어그램 • 대리키 • 대체키 • 데이터 • 데이터댐 • 데이터마트 • 데이터 모델링 • 데이터뱅크 • 데이터베이스(DB) • 데이터베이스 언어 • 데이터 사이언스 • 데이터 사전 • 데이터 웨어하우스 • 데이터 정의어(DDL) • 데이터 제어어(DCL) • 데이터 조작어(DML) • 데이터 클러스터 • 데이터 토큰 (문자열) • 데이터 통합 • 덱 • 디비서버 • 라이트조인 • 락 • 레코드 • 레프트조인 • 로그 • 로그파일 • 로깅 • 롤백 • 리두로그 • 릴레이션 • 마스터데이터 • 마스터데이터관리(MDM) • 마이그레이션 • 메타데이터 • 배열 • 뷰 • 빅데이터 • 서브쿼리 • 수퍼키 • 순차리스트 • 스키마 • 스택 • 슬로우쿼리 • 엔티티 • 역정규화 • 연결리스트 • 외래키(FK) • 외부조인 • 인덱스 • 인덱싱 • 인젝션 • 자료구조 • 정규화 • 정보 • 조인 • 커밋 • 쿼리 • 큐 • 키 • 타깃 • 테이블 • 튜플 • 트랜잭션 • 트리 • 트리거 • 티비마이그레이터 • 풀조인 • 프로시저 • 필드 • 해시 • 해시맵 • 해시태그 • 해시테이블 • 해시함수 • 해싱 • 후보키
|
|
데이터베이스 관리 시스템 (DBMS)
|
관계형 데이터베이스 관리 시스템(RDBMS) • 노에스큐엘(NoSQL) • 데이터베이스 관리 시스템(DBMS) • 더비 • 디비투(DB2) • 레디스 • 마리아디비(MariaDB) • 마이에스큐엘(MySQL) • 몽고디비 • 빅테이블 • 사이베이스 • 선디비 • 알티베이스 • 액세스 • 에스큐엘(SQL) • 에스큐엘라이트(SQLite) • 에이치베이스 • 엠에스에스큐엘(MS-SQL) • 오라클(Oracle) • 인터베이스 • 인포믹스 • 카산드라 • 카우치디비 • 큐브리드 • 티베로 • 파이어버드 • 포스트그레스큐엘(PostgreSQL) • 하이퍼테이블
|
|
DB 명령어
|
alter • array • create • delete • drop • from • full join • grant • inner join • insert • join • left join • null • order by • outer join • rename • revoke • right join • select • truncate • update • where
|
|
시스템 연계
|
API • CGI • EAI • ESB • JPA • RSS • SOA • SOAP • SSL • SSO • web3.js • XML • 디비투디비(DB-to-DB) • 레스트풀(RESTful) • 상호운용성 • 시스템 인터페이스 • 신디케이션 API • 오픈 API • 웹 API • 웹개방성 • 윈도우 API • 자바 API • 크롤링 • 프라이빗 API
|
|
위키 : 자동차, 교통, 지역, 지도, 산업, 기업, 단체, 업무, 생활, 쇼핑, 블록체인, 암호화폐, 인공지능, 개발, 인물, 행사, 일반
|
|