2012-02-13 38 views
1

我想要做的事:
我想確保在對源文件進行任何更改後,開發人員會增加開發者設置的靜態值。如果開發人員無法增加版本,則會引發錯誤。Java類對象哈希更改沒有源更改

我在做什麼:
我有一個測試程序,從類對象獲取輸入流,並通過MD5哈希算法運行它。在這一點上,我記錄散列和版本號,形成一個數據對。如果散列更改沒有更改版本,則會引發錯誤。

我的問題是:
對於大多數情況下,代碼是按照預期工作的,確定何時類已更改但開發者版本尚未更改。但是,儘管沒有對實際源代碼進行明顯更改,但我在輸出哈希中遇到間歇性更改。

我對我的測試方法是:

  • 測試01:編譯代碼,運行測試程序,並記錄哈希值。
  • 測試02:刪除類文件,編譯代碼,運行測試程序並記錄散列。
  • 測試03:刪除類文件,更改代碼,編譯,運行測試程序,並記錄散列。 (在這一點上散列值變化)
  • 測試04:刪除類文件,顛倒上一次構建的變化,編譯,運行測試程序並記錄散列。

Test04後,哈希應該是一樣的,從Test02自改哈希已恢復,然而,這並非如此。

我的問題是:
有沒有我沒有看到或會計的變量?

謝謝你的時間。

+1

無法使用serialVersionUID? http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/ – 2012-02-13 06:47:12

+0

是否要檢測更改到代碼,或只是該類的公共接口? – msandiford 2012-02-13 07:35:34

+1

我懷疑這些更改是嵌入類文件中的某處的時間戳/日期時間問題。您嘗試實現的可重現性也受編譯器及其所使用的開關的影響。你看過代碼簽名嗎?也許它可以幫助你滿足你的要求。哈希/跟蹤源文件以查找更改可能會更好。 – vasquez 2012-02-13 07:42:44

回答

1

爲什麼不讓Java爲您計算一個serializationId?許多更改應自動導致計算的更改。

這就是說,你爲什麼要這樣做?如果您使用持續集成和Maven/Ivy,可能會實現您正在嘗試執行的操作。

+0

確實,這是最好的解決方案。 – 2012-02-13 13:04:48