2012-02-11 49 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