2014-02-26 100 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)) 

代替。