2014-02-26 63 views
3

我想过学习一些新东西,并开始在一个新的小项目中使用Google Guava。不明白番石榴PrimitiveSink

我必须做的第一件事之一是实现一个简单的基于密钥交换的认证。

该计划是,结合一些值,并生成一个SHA256散列。

在纯Java是

final String toHash = id + ts + secret; 
    final MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    final byte[] hash = digest.digest(toHash.getBytes("UTF-8")); 
    final String result = getHexFormated(hash) 

番石榴我试图

final Hasher hasher = Hashing.sha256().newHasher().putString(id, Charsets.UTF_8) 
     .putLong(ts).putString(secret, Charsets.UTF_8); 
    final HashCode hashcode = hasher.hash(); 

如果我比较hashcode.toString第一个结果()它是完全不同的。 如果我比较byte []本身,要小心,那不是getHexFormated是错的,字节数组也是完全不同的。

那么这里有什么问题?一个PrimitiveSink而不是简单地组合给定的值是什么?

+4

在你的第一个代码片段中,你将'long'转换为'String';在第二个中,您直接放置了“long”值!试着把'String.valueOf(ts)'而不是'ts'。 – fge

+1

你是对的,就是这样。你可以发布它作为答案,所以我可以投票。那么PrimitiveSink在这里做什么?它不是简单地将这些部分组合在一起吗? – Nabor

+1

实际上,一个'PrimitiveSink'什么也不做,它只是一个接口,它应该吞噬你扔在它上面的所有东西;一个'Hasher'只是简单的实现了这个接口(并且事实证明它变成了'byte's)。 – fge

回答

4

在你的第一个片段你这样做:

final String toHash = id + ts + secret; 

其中tslong;但是,在上述语句中,它将作为字符串附加。

在你的第二个片段,你这样做:

.putLong(ts) 

这样,你的输出会有所不同...你应该

.putString(String.valueOf(ts)) 

代替。