2012-02-11 28 views
0

我有一个列表,并且该列表有一个x509certificate,我用它来存储在一个cms包中。所有的花花公子,直到我遇到问题:我不能让同一个人签署两次。
所以,我知道如何通过等于找到该证书,所以一个线性搜索。如何使用二进制搜索比较x509certificates

这可能听起来纯虚荣,但我宁愿使用二进制搜索,使用,显然,comparable
天哪,我能做到吗? (javabouncyCastle)。

感谢

+1

它实现了#equals(Object)&#hashCode() - 即你可以使用散列图来查找它。 – Jens 2012-02-11 21:36:34

+1

或者更简单,一个HashSet。如果(set.add(cert)){...} – dnault 2012-02-11 22:34:00

+0

我想通过serialnumber进行搜索,只要我找到比较编码字节(.getEncoded())...你觉得怎么样? – 2012-02-11 22:40:51

回答

2

我要感谢Jensdnault指导我的回答:
我要进行排序,并使用(BIGINTEGER)的SerialNumber,所有证书都有,比较搜索证书,只要我找到一个类似的序列,我将以DER编码格式比较它们。

为什么我没有使用哈希码方法,您可能会问:
并非所有的证书和签名都会在内存中。有些情况下,有时会存在于PKCS7(CMS)或XMLDSig文件中。所以对象的哈希码可能不同,因为它们在物理上是不同的对象,但从逻辑上讲,它们指的是相同的证书。

覆盖getHashCode将只给出答案的一半,有时候,序列号不会太频繁出现两次,因为它取决于它所属的链等因素。

感谢您的信息和帮助。

2

商店中的证书在TreeSet和使用Collections.binarySearch寻找感兴趣的证书(你必须把你的SetList第一)。底层TreeSetTreeMap,因此如果您不喜欢该实施,则可以实施SortedSet并制作您自己的。如果重复的证书不是问题,则将其存储在List中,并在调用binarySearch之前对其进行分类。

是不是有一个原因,你不想使用良好的'Collection.contains

+0

的事情是,bouncycastle和java的X509Certificate的实现没有实现可比较的或可比较的接口... – 2012-02-11 22:35:58

+0

,我不知道如何使用作为比较... – 2012-02-11 22:37:46

+0

然后,只要去'HashSet' ,'Set.contains()',并转向代码的更重要部分。 – Paul 2012-02-12 02:16:37