Windows XP의 첫 사용자 그림, GetTickCount 시드와 리저버 샘플링으로 골랐다
- Windows XP는 첫 사용자 그림을 고를 때 GetTickCount() 값으로 시드한 RtlRandomEx 난수 생성기를 사용했음
- 기본 그림 디렉터리를 한 번만 순회하며 항목 n번째마다 n분의 1 확률로 현재 항목으로 교체하는 리저버 샘플링 k=1 변형을 적용했음
- 두 번 순회해 파일 수를 세고 인덱스를 찾는 방식보다 파일 시스템 호출이 적고, 순회 중 디렉터리 내용이 바뀌어도 처리하기 쉬웠음
- 병적인 경우를 막기 위해 기본 그림 디렉터리에서 최대 100장까지만 표본 추출했음
Hacker News opinions
기본 폴더에 들어 있던 이미지 수보다 한참 큰 제한이라서, 100장은 당시 기준에선 적절해 보임.
관리자 계정은 체스판 그림이었던 기억이 나는데, 그냥 잘못 기억하는 건지 모르겠음.
안전 모드 같은 경우에는 무작위 선택 코드를 건너뛰었을 수도 있다고 봄.
내 기억에도 관리자 계정은 체스 말이었고 일반 계정은 주황색 물고기였음. 다만 이젠 기억을 믿기 어렵긴 함.
체스 그림은 목록 첫 번째 이미지라서 그렇게 기억되는 것도 말이 됨.
Windows가 만든 이름 그대로의 Administrator 계정은 항상 체스 그림을 썼던 걸로 앎.
이걸 읽고 나서야 내가 단순한 문제면 파일 수를 세고 무작위 인덱스를 골랐을 거라는 생각이 듦. Zig를 쓰며 문자열과 자료구조 할당 비용을 의식하게 된 경험도 떠오름.
새 계정을 만들 때 기존 사용자와 같은 그림이 나오지 않도록 검사하는지도 궁금함.
사용자 이름 첫 글자로 난수를 만들고 이미지 수로 나머지 연산을 하면 되지 않았나 싶었음.
그 방법은 실행 전에는 이미지 수를 모르니 나머지 연산에 쓸 수가 없음.
Chen이 말한 실제 코드는 NT5 소스 저장소에 올라와 있음.