1.8.0和1.8.1的乌龙

作者尝试使用Java实现SHA1校验程序,通过MessageDigest类进行文件校验码的生成,并利用JUnit进行测试。然而,测试未能通过,经过一番排查发现是因为误将不同版本的文件进行了比对。
下Subversion的时候看见他家主页上的SHA1验证心血来潮,当是复习Java自己写一个SHA1的验证程序。调用的当然是非常简单易用的MessageDigest。
public class MessageDigestCheckSumValidator extends CheckSumValidator {
	
	private String algorithm="";
	private DigestInputStream digestInputStream =null;
	private MessageDigest messageDigest = null;
	
	protected DigestInputStream getDigestInputStream() {
		return digestInputStream;
	}


	protected void setDigestInputStream(DigestInputStream dis) {
		this.digestInputStream = dis;
	}


	protected MessageDigest getMessageDigest() {
		return messageDigest;
	}


	protected void setMessagedigest(MessageDigest md) {
		this.messageDigest = md;
	}


	
	protected String getAlgorithm() {
		return algorithm;
	}


	protected void setAlgorithm(String algorithm) {
		this.algorithm = algorithm;
	}


	public MessageDigestCheckSumValidator (String targetCheckSum, InputStream inputStream, String algorithm){
		this.setTargetCheckSum(targetCheckSum);
		this.setInputStream(inputStream);
		this.setAlgorithm(algorithm);
	}
	
	protected String byteArrtoHexaDecimal(byte[] bytes){		
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<bytes.length; i++){
			sb.append(Integer.toString((bytes[i]&0xff)+0x100,16).substring(1));
		}
		return sb.toString();
	}

	@Override
	protected boolean validateCheckSum() {
		BufferedInputStream bis =null;
		try{
			this.setMessagedigest(MessageDigest.getInstance(this.getAlgorithm()));
			bis = new BufferedInputStream(this.getInputStream());
			this.setDigestInputStream(new DigestInputStream(bis,this.getMessageDigest()));
			while(this.digestInputStream.read()!=-1);
			byte[] bytes = this.getMessageDigest().digest();
			String hexaDemicalCheckSumStr = this.byteArrtoHexaDecimal(bytes);
			if (this.getTargetCheckSum().equals(hexaDemicalCheckSumStr)){
				return true;
			}else{
				return false;
			}
		}catch(NoSuchAlgorithmException e){
			e.printStackTrace();
			return false;
		}catch(IOException e){
			e.printStackTrace();
			return false;
		}finally{
			if(bis!=null){
				try{
					bis.close();
				}catch(IOException e){
					e.printStackTrace();
				}

			}
		}

	}

}

结果用Junit跑了个测试竟然木有通过。。。人家网站上的校验码是12261a97df5cdc53175cba813ea451937a226bca,可跑出来是6f2b4476b8d8b9f2700ae101252bdf6e67366302。换了两三种ByteArray2HexaDecimal的方法,结果还是一样。

百思不得骑姐的情况下,从网上搜索了两个程序进行对照,结果竟然也同样是6f2b4476b8d8b9f2700ae101252bdf6e67366302。

看来要出动google大神了,突然就想到用这个“错误”的校验码看看能搜到什么东西。


竟然有一个版本的校验法就是6f2b4476b8d8b9f2700ae101252bdf6e67366302,再凝神一看svn的版本号,再对一下svn官方网站上的版本号,乌龙就这么诞生了。。。一直以为下的是1.8.1结果神使鬼差的一直在对1.8.0做校验。重新下载,再跑,通过了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值