2014-12-09 5 views
1

상점에 주소가 포함되어 있는지 빠르게 확인하거나 3.4.*.* 또는 *.5.*.*과 같은 패턴과 일치하는 모든 주소를 반환 할 수 있도록 약 60000 개의 IP 주소와 같은 항목을 저장해야합니다. 이전 구현에서는 네 레벨 깊이로 중첩 된 HashTables을 사용했습니다. 스레드가 완전히 안전하지는 않으며 이로 인해 버그가 발생합니다. 이 스레드를 외부 레이어에서 잠글 때 안전하게 할 필요가 있거나 모두를 ConcurrentDictionaries으로 변경할 수 있지만 그 옵션 중 어느 것도 적합하지 않은 것으로 보입니다. 사전에있는 키에 대한 바이트를 사용하는 것은 나에게 일반적으로, 특히 중량이 큰 사전을 느낄 수 없었습니다. 제안?아이디어?

+1

목록이 변경되거나 정적입니까? – spender

+1

60,000은 계산식으로 말하면 꽤 작은 숫자입니다. 중첩 된 HashTables의 고정 오버 헤드가 전체 목록을 반복하고 기준에 맞는 모든 요소를 ​​검사하는 것보다 높을 것입니다. 가장 간단한 구현을 시도하고 프로필을 작성한 다음 빠르게 작성해야하는지 확인하십시오. 그렇다면 다양한 색인을 사용하여 작업 속도를 높일 수 있지만 필요하지 않을 수도 있습니다. –

+1

IP 주소는 얼마나 무작위입니까? 전체 서브넷을 가질 것으로 예상합니까 (IP/넷 마스크를 저장하는 것이 합리적입니다), 아니면 단일 주소가 될 가능성이 더 큽니까? –

답변

0

구아바는 IP 조회 일치를 저장하기 위해 접두어 trie를 사용합니다. 당신은 여기에 코드를 볼 수 있습니다

https://code.google.com/p/google-collections/source/browse/trunk/src/com/google/common/collect/PrefixTrie.java?r=2

이 자바 코드입니다,하지만 난 당신이 쉽게 C 번호에 적응할 수있는 확신합니다. 접두어 trie의 기술은 언어와 독립적으로 적용 가능하며 자유로운 와일드 카드 매치를 얻을 수 있습니다. 임의의 와일드 카드를 원한다면 직접 구현해야합니다. 또는 Directed acyclic word graph (DAWG)과 비슷한 데이터 구조를 만들 수도 있습니다. 이렇게하면 임의의 와일드 카드 일치를 직접 구현할 수 있습니다.

+0

"trie"는 내가 필요한 단어입니다. 감사. – Brannon