해시테이블(hash table)은 해시함수를 사용하여 키를 해시값으로 매핑하고, 이 해시값을 인덱스 혹은 주소 삼아 데이터의 값(value)을 키와 함께 저장하여 검색을 빠르게 하기 위한 자료 구조이다. 이 때 데이터가 저장되는 곳을 버킷(bucket) 또는 슬롯(slot)이라고 한다. 해시테이블의 기본 연산은 삽입, 삭제, 탐색이다.
개요
해시테이블은 연관 배열 추상 데이터 유형을 구현하는 데이터 구조로서, 키를 값에 매핑할 수 있는 구조이다. 해시함수를 사용하여 원하는 값을 찾을 수 있는 버킷이나 슬롯의 배열로 인덱스를 계산한다. 이상적으로는 해시함수가 각각의 키를 고유 버킷에 할당하지만, 대부분의 해시 테이블 설계에서는 불완전한 해시함수를 채용하고 있어 해시함수가 둘 이상의 키에 대해 동일한 인덱스를 생성하는 해시 충돌의 원인이 될 수 있다. 적절한 규모의 해시테이블에서, 각 조회의 평균 비용은 표에 저장된 요소의 수와 무관하다. 많은 해시 테이블 설계는 운용당 일정한 평균 비용으로 키 값 쌍을 임의로 삽입과 삭제를 허용한다. 많은 상황에서 해시테이블은 검색 트리나 다른 테이블 조회 구조보다 평균적으로 더 효율적이다. 때문에 해시테이블은 특히 연관 배열, 데이터베이스 색인화, 캐시, 많은 종류의 컴퓨터 소프트웨어에서 널리 사용된다.
Direct-address table
Direct-address table은 키의 전체 개수와 동일한 크기의 버킷을 가진 해시테이블이다. Direct-address table의 장점은 키 개수와 해시테이블 크기가 동일하기 때문에 해시충돌 문제가 발생하지 않는다는 것이다. 하지만 실제 사용하는 키(actucal key)보다 전체 키(unverse of key)보다 훨씬 많은 경우 사용하지 않는 키들을 위한 공간까지 마련해야 하는 탓에 메모리 효율성이 크게 떨어진다. 보통의 경우 다뤄야할 데이터가 정말 많고, 메모리 등 리소스 문제도 생기기 때문에 Direct-address table보다는 해시테이블 크기()가 실제 사용하는 키 개수()보다 적은 해시테이블을 더 선호한다. 이 때 해시테이블의 한 버킷에 평균 몇 개의 키가 매핑되는가를 나타내는 지표로 을 라고 한다. Direct-address table의 load factor는 1 이하이며, 1보다 큰 경우 해시충돌이 발생하게 된다.[1]
장점
- 다량의 데이터를 적은 리소스로 관리할 수 있어 효율적이다. 하드디스크나 클라우드에 존재하는 무한에 가까운 데이터(키)들을 유한한 개수의 해시값으로 매핑함으로써 작은 크기의 캐시 메모리로도 프로세스를 관리할 수 있게 된다.
- 인덱스(index)에 해시값을 사용해서 모든 데이터를 살피지 않아도 삽입/삭제을 편하게 수행할 수 있다.
- 언제나 동일한 해시값을 리턴하고, 해당 인덱스만 알면 해시테이블의 크기에 상관없이 데이터에 빠르게 접근할 수 있으며, 인덱스는 계산이 간단한 함수(상수시간)로 작동하기 때문에 매우 효율적이다. 다시 말해, 데이터 액세스 시 계산복잡성으로 0(1)을 지향한다.
- 키와 해시값 사이에 직접적인 연관이 없기 때문에 해시값만 가지고는 키를 온전히 복원하기 어려워 보안 분야에서 널리 사용된다.
- 길이가 서로 다른 입력데이터에 대해 일정한 길이의 출력을 만들 수 있어서 데이터를 축약할 수도 있다.
문제점
- 해시테이블에서의 연산은 평균적으로 일정한 시간이 걸리지만 좋은 해시 함수의 비용은 순차 목록 또는 검색 트리에 대한 검색 알고리즘의 내부 루프보다 상당히 클 수 있다. 따라서 해시 테이블은 항목 수가 매우 적으면 유효하지 않는다.(해시 함수를 계산하는데 드는 높은 비용은 해시값을 키와 함께 저장하여 완화 할 수 있음)
- 맞춤법검사와 같은 특정 문자열 처리 응용 프로그램의 경우 해시테이블은 트리, 유한 오토마타 또는 주디 배열보다 효율적이지 않을 수 있다. 또한 저장할 수 있는 키가 너무 많지 않은 경우 즉, 각 키를 충분히 작은 비트수로 표현할 수 있는 경우 해시테이블 대신 키를 배열의 인덱스로 직접 사용할 수 있다. 이 경우에는 충돌이 발생하지 않는다.
- 해시테이블에 저장된 항목은 효율적으로(항목 당 일정한 비용으로) 열거되지만 의사 임의의 순서로만 열거 할 수 있다. 따라서 키가 지정된 키와 가장 가까운 항목을 찾는 효율적인 방법은 없다. 특정 순서로 모든 n개 항목을 나열하려면 일반적으로 비용이 항목 당 log(n)에 비례하는 별도의 정렬 단계가 필요하다. 이에 비해 정렬 검색 트리는 조회 및 삽입 비용이 log(n)에 비례하지만 거의 동일한 비용으로 가장 가까운 키를 찾을 수 있으며 입력 당 일정한 비용으로 모든 항목을 나열한 순서가 매겨진다.
- 해시함수가 충돌하지 않기 때문에 키가 저장되어 있지 않으면 주어진 순간에 테이블에 있는 키를 쉽게 열거할 수 없다.
- 작업당 평균 비용이 일정하고 상당히 작지만, 단일 작업의 비용은 상당히 높을 수 있다. 특히 해시테이블이 동적 크기 조정을 사용하는 경우 삽입 또는 삭제 작업은 때때로 항목 수에 비례하여 시간이 걸릴 수 있다. 이는 실시간 또는 인터렉티브 애플리케이션에서 심각한 단점이 될 수 있다.
- 해시테이블은 일반적으로 참조의 지역성이 낮다. 즉, 액세스 할 데이터는 임의로 메모리에서 무작위로 분산되어 있다. 해시테이블이 액세스 패턴을 야기하기 때문에 긴 지연을 유발하는 마이크로 프로세서 캐시 미스가 발생할 수 있다. 선형 검색으로 검색된 배열과 같은 소형 데이터 구조는 테이블이 비교적 작고 키가 소형인 경우 더 빠를 수 있다. 최적의 성능 포인트는 시스템마다 다르다.
- 해시테이블은 많은 충돌이 있을 때 매우 비효율적이다. 극단적으로 고르지 않은 해시 분포가 우연히 발생 할 가능성은 거의 없지만 해시 함수에 대해 잘 알고 있는 악의적인 공격자는 과도한 충돌로 인해 최악의 행동을 일으키는 정보를 해시에 제공할 수 있다. 예를 들어, 서비스 거부 공격과 같은 매우 낮은 성능을 유발할 수 있다. 중요한 애플리케이션에서 최악의 경우 보증이 더 나은 데이터 구조를 사용할 수 있지만, 범용 해싱은 공격자가 어떤 입력으로 최악의 행동을 유발하는지 예측할 수 없게 하는 무작위 알고리즘이 선호될 수 있다. 리눅스 라우팅 테이블 캐시의 해시테이블에서 사용된 해시 함수는 이러한 공격에 대한 대책으로 리눅스 버전 2.4.2에서 변경되었다.
활용
연관배열
해시테이블은 일반적으로 여러 유형의 메모리 내 테이블을 구현하는데 사용된다. 특히 루비, 파이톤, PHP와 같은 해석된 프로그래밍 언어에서 연관배열(지표가 임의의 문자열 또는 기타 복잡한 객체인 배열)을 구현하는데 사용된다.
멀티맵에 새 항목을 지정하고 해시 충돌이 발생하면 멀티맵은 두 항목을 모두 무조건 사용한다. 새 항목을 일반적인 연관배열에 저장하고 해시충돌이 발생하지만 실제 키 자체가 다른 경우 연관배열도 마찬가지로 두 항목을 모두 저장한다. 그러나 새 항목의 키가 이전 항목의 키와 정확하게 일치하는 경우 연관배열은 일반적으로 이전 항목을 지우고 새 항목으로 덮어 쓰기 때문에 테이블의 모든 항목은 고유 키를 갖는다.
데이터베이스 색인화
해시테이블은 디스크 기반 데이터 구조 및 데이터베이스 인덱스(예:dbm)로도 사용될 수 있지만 B- 트리는 이러한 응용 프로그램에서 더 많이 사용된다. 다중 노드 데이터베이스 시스템에서 해시테이블은 일반적으로 노드 사이에 행을 분산하는 데 사용되어 해시조인에 대한 네트워크 트래픽을 줄인다.
캐시
해시테이블은 느린 미디어에 주로 저장된 데이터에 대한 액세스 속도를 높이기 위해 사용되는 캐시, 보조 데이터 테이블을 구현하는데 사용할 수 있다. 이 응용 프로그램에서는 충돌하는 두 항목 중 하나를 삭제하여 해시충돌을 처리할 수 있다. 일반적으로 현재 테이블에 저장된 이전 항목을 지우고 새 항목으로 덮어 쓰므로 테이블의 모든 항목은 고유한 해시값을 갖는다.
세트
주어진 키를 가지고 있는 항목을 복구하는 것 외에도, 많은 해시테이블 구현들은 그러한 항목이 존재 여부를 구별할 수 있다. 따라서 이러한 구조는 특정 키가 특정 키 집합에 속하는지 여부를 기록하는 세트 데이터 구조를 구현하는 데 사용될 수 있다. 이 경우 입력값과 관련된 모든 부분을 제거함으로써 구조를 단순화 할 수 있다. 해시는 정적 집합과 동적 집합을 구현하는 데 사용될 수 있다.
객체 표현
펄, 파이톤, 자바스크립트, 루아, 루비와 같은 몇몇 동적 언어는 해시테이블을 사용하여 개체를 구현한다. 이 표현에서 키는 개체의 구성원과 메소드의 이름이며, 값은 해당 구성원이나 메소드에 대한 포인터가 된다.
독특한 데이터 표현
해시테이블은 같은 내용을 가진 다중 문자열 생성을 피하기 위해 일부 프로그램에서 사용할 수 있다. 이를 위해 프로그램에서 사용중인 모든 문자열은 해시테이블로 구현된 단일 문자열 풀에 저장되며, 이 문자열 풀은 새 문자열을 만들어야 할 때마다 확인된다. 이 기법은 해시컨설팅이라는 이름으로 Lisp 인터프리터에 도입되었으며, 다른 많은 종류의 데이터(심볼릭 대수 시스템의 표현트리, 데이터베이스의 레코드, 파일 시스템의 파일, 이진법 결정 다이어그램 등)와 함께 사용할 수 있다.
각주
참고자료
같이 보기
이 해시테이블 문서는 블록체인 기술에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.
|
블록체인 : 블록체인 기술 □■⊕, 합의 알고리즘, 암호 알고리즘, 알고리즘, 블록체인 플랫폼, 블록체인 솔루션, 블록체인 서비스
|
|
블록체인 기술
|
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
|
|
위키 : 자동차, 교통, 지역, 지도, 산업, 기업, 단체, 업무, 생활, 쇼핑, 블록체인, 암호화폐, 인공지능, 개발, 인물, 행사, 일반
|
|
개발 : 프로그래밍 □■⊕, 소프트웨어, 데이터, 솔루션, 보안, 하드웨어, 컴퓨터, 사무자동화, 인터넷, 모바일, 사물인터넷, 게임, 메타버스, 디자인
|
|
프로그래밍 언어
|
ASP • C 언어 • C++ • C# • CSS • D 언어 • HTML • HTML5 • JSP • PHP • R • XHTML • XML • XSLT • 고(Go) • 고급언어 • 기계어 • 델파이 • 러스트 • 루비 • 루아 • 리액트 • 리퀴디티 • 무브 • 미켈슨 • 베이직 • 브이비스크립트 • 비주얼 C++ • 비주얼베이직(VB) • 비주얼베이직닷넷(VB.NET) • 솔리디티 • 스몰토크 • 스위프트 언어 • 스칼라 • 스크립트 언어 • 알골 • 어셈블리 • 언리얼스크립트 • 얼랭 • 에이잭스(Ajax) • 엠에프씨(MFC) • 오브젝티브-C • 오브젝트 파스칼 • 오카멜 • 웹어셈블리(WASM) • 이와즘(eWASM) • 자바 • 자바스크립트 • 저급언어 • 제이슨(JSON) • 제이쿼리(jQuery) • 카멜 • 코볼 • 코틀린 • 콜드퓨전 • 타입스크립트 • 파스칼 • 파워스크립트 • 파이썬 • 펄(Perl) • 포트란 • 프로씨(Pro-C) • 피엘에스큐엘(PL/SQL) • 피엘원(PL/I) • 하스켈
|
|
개발방법론
|
CBD 개발방법론 • EA • 구조적 개발방법론 • 객체지향 개발방법론 • 라이브러리 • 람다 아키텍처 • 모듈 • 모듈화 • 벤치마킹 • 소프트웨어 개발방법론 • 스크럼 • 스프린트 • 아키텍처 • 아키텍트 • 애자일 • 웹개발방법론 • 정보공학 개발방법론 • 컴포넌트 • 테일러링 • 템플릿 • 폭포수 모델 • 프로젝트 • 프로토타입 • 피드백
|
|
코딩
|
EUC-KR • UTF-8 • 값 • 글루웨어 • 노팔로우 링크 • 두팔로우 링크 • 디버깅 • 디코딩 • 마크업 • 버그 • 부트스트랩 • 세이브포인트 • 소스코드 • 시큐어코딩 • 아스키 • 액티브엑스 • 오픈소스 • 유니코드 • 인코딩 • 재컴파일 • 주석 • 컴파일 • 컴퓨터 프로그램 • 코드 • 코딩 • 태그 • 테스트 • 테이블 • 텍스트 • 파싱 • 퍼블리싱 • 퓨니코드 • 하드코딩 • 하이퍼링크 • 하이퍼텍스트
|
|
프로그래밍
|
C 명령어 • 객체 • 객체지향 • 객체지향 프로그래밍 • 거짓 • 관계연산자 • 기본형 변수 • 널 • 논리 • 논리연산 • 논리연산자 • 다중상속 • 다형성 • 대입 • 대입문 • 대입연산자 • 더블 • 도스 명령어 • 디폴트 • 레지스터변수 • 루프 • 리눅스 명령어 • 리턴 • 메모리 주소 • 메소드 • 멤버 • 명령문 • 명령어 • 무한루프 • 문자 • 문자열 • 바이트 • 반복문 • 배열 • 변수 • 분기 • 분기문 • 불린 • 브레이크 • 비교연산자 • 비트연산자 • 산술연산자 • 상속 • 상수 • 생성자 • 선언 • 선언문 • 설정자 • 속성 • 스위치 • 스태틱 • 시프트연산자 • 실행 • 실행문 • 어노테이션 • 에코 • 역참조 • 연산 • 연산문 • 연산자 • 오버로딩 • 오버라이딩 • 외부변수 • 윈도우 명령어 • 유닉스 명령어 • 인스턴스 • 인스트럭션 • 인클루드 • 인터페이스 • 임포트 • 입력 • 입력문 • 입출력 • 입출력문 • 자료형(데이터 타입) • 자바 명령어 • 자바 예약어 • 자바 컬렉션 • 전역변수 • 접근자 • 접근제어자 • 정보은닉 • 정수형 • 정적변수 • 제어 • 제어문 • 제어자 • 조건 • 조건문 • 조건연산자 • 주소 • 증감연산자 • 지역변수 • 참 • 참조 • 참조변수 • 초기화 • 추상메소드 • 추상클래스 • 추상화 • 출력 • 출력문 • 캡슐화 • 케이스 • 클래스 • 파라미터(매개변수) • 파이널 • 패키지 • 퍼블릭 • 포인터 • 프라이빗 • 프로텍티드 • 필드(멤버변수) • 함수 • 환경변수
|
|
명령어
|
abstract • array • boolean • break • byte • case • char • continue • default • double • do while • echo • elif • else • else if • false • final • float • for • gosub • goto • if • if else • import • include • int • join • long • long long • null • print • printf • println • private • protected • public • return • scanf • short • stdio.h • static • string • switch • temp • then • true • unsigned • void • while
|
|
디자인패턴
|
구조패턴 • 동시성패턴 • 동시실행패턴 • 모델-뷰-컨트롤러 패턴 • 상태패턴 • 생성패턴 • 싱글톤패턴 • 아키텍처패턴 • 전략패턴 • 커맨드패턴 • 행동패턴
|
|
프로그래밍 인물
|
귀도 반 로썸 • 그레이스 머레이 호퍼 • 니클라우스 비르트 • 댄 브릭클린 • 더그 커팅 • 데니스 리치 • 리누스 토르발스 • 리처드 그린블라트 • 마거릿 해밀턴 • 마크 앤드리슨 • 빈트 서프 • 빌 게이츠 • 빌 조이 • 스티브 잡스 • 에이다 러브레이스 • 제임스 고슬링 • 척 벤턴 • 켄 톰슨 • 팀 패터슨
|
|
위키 : 자동차, 교통, 지역, 지도, 산업, 기업, 단체, 업무, 생활, 쇼핑, 블록체인, 암호화폐, 인공지능, 개발, 인물, 행사, 일반
|
|