Go 1.24 내장 map, 버킷 구현을 Swiss Tables 기반으로 교체
- Go 1.24는 내장 map의 기존 버킷 기반 런타임 구현을 Swiss Tables 기반 설계로 교체함
map[string]int변수는 런타임의internal/runtime/maps.Map포인터를 가리키며, 맵 변수를 복사하면 같은 엔트리 저장소를 공유함- 런타임
Map의 used 필드는 현재 엔트리 수를 저장하고, Go는len(m)을 이 필드 접근으로 치환하므로 O(1) 시간에 길이를 구함 - 각 맵은 무작위 seed를 받고, 같은 키라도 맵마다 다른 해시값과 저장 위치를 갖도록 해 충돌 패턴을 분산함
- 가장 작은 Swiss Table 저장 단위인 group은 키-값 슬롯 8개와 각 슬롯 상태를 담는 제어 바이트 8개를
uint64하나에 저장함
Hacker News opinions
Swiss Tables는 구글 취리히 사무소 엔지니어들이 만들었고, 그래서 이름도 그렇게 붙었음. Go가 같은 구글 출신인데 이제야 쓴다는 게 조금 놀라운데, Matt Kulukundis의 CppCon 2017 발표가 개발 과정을 잘 설명함.
Go는 Swiss Tables보다 훨씬 오래됐음. Go 1.0부터 해시 테이블이 있었을 텐데 Swiss Tables가 나오기 전이니 당시 구현이 그 방식일 수는 없었겠지.
Go에 도입이 늦은 데는 구현 난점도 있었을 것 같음. Go 팀이 정리한 Swiss Tables 도입 과정의 Go 특유 과제를 보면 이유가 나옴.