2012-02-11 3 views
0

목록이 있으며 목록에 x509certificate이 있는데,이 목록은 CMS 패키지에 저장하는 데 사용됩니다. 모든 문제는 내가 문제에 부딪 칠 때까지 : 나는 같은 사람을 두 번 사인 할 수 없다.
그래서, 나는 등호로 인증서를 찾는 법을 알고 있습니다. 그래서 선형 검색입니다.이진 검색을 사용하여 x509certificates를 비교하는 방법

그것은 순수한 허영을 들릴지 모르지만, 오히려 분명히 사용하여 이진 검색을 사용, comparable.
하늘에서 나는 그것을 어떻게 할 수 있습니까? (java 또는 bouncyCastle).

감사 TreeSet에서

+1

#equals (Object)와 #hashCode()를 모두 구현합니다. 즉 해쉬 맵을 사용하여 찾을 수 있습니다. – Jens

+1

또는 더 간단하지만, HashSet. – dnault

+0

serialnumber로 검색 할 때 인코딩 된 바이트를 비교하자마자 (.getEncoded()) ... 어떻게 생각하십니까? –

답변

2

나는 대답에 저를 안내 Jensdnault 감사드립니다 비슷한 시리얼, DER 인코딩 형식으로 비교할 예정입니다.

해시 코드 접근 방식을 사용하지 않은 이유는 다음과 같습니다.
모든 인증서와 서명이 메모리에있는 것은 아닙니다. 때때로, 일부는 PKCS7 (CMS) 또는 XMLDSig 파일에 있습니다. 그래서 객체의 해시 코드는 물리적으로 다른 객체이기 때문에 다를 수 있지만 논리적으로는 동일한 인증서를 참조합니다.

getHashCode를 무시하면 응답의 절반 밖에 제공하지 않는 경우가 종종 있습니다. 일련 번호가 속한 체인과 다른 요인에 따라 두 번 발생할 수 있습니다.

정보와 도움에 감사드립니다.

2

저장합니다 인증서 표시 및 관심있는 인증서를 찾기 위해 Collections.binarySearch을 사용 (당신은 당신의 SetList로를 설정해야합니다). TreeSet 밑에는 TreeMap입니다. 따라서 해당 구현이 마음에 들지 않으면 SortedSet을 구현하고 직접 만들 수 있습니다. 중복 된 인증서가 중요하지 않은 경우 List에 저장하고 binarySearch으로 전화하기 전에 정렬하십시오.

좋은 사용을 원하지 않는 이유가 있습니까? 'Collection.contains?
나는 즉시 내가 찾을로 정렬하고 비교하기 위해, 모든 인증서를 가지고있는 (BigInteger의)의 serialNumber를 사용하여 인증서를 검색하기 위하여려고하고있다 :

+0

사실 bouncycastle과 Java의 X509Certificate 구현은 비교 가능한 또는 유사한 인터페이스를 구현하지 않습니다 ... –

+0

그리고 비교로 사용하는 방법을 알지 못합니다 ... –

+0

그러면 'HashSet' ,'Set.contains()', 그리고 코드의 더 중요한 부분으로 이동하십시오. – Paul

관련 문제