6

問題爲什麼crypto.createHash在新版本中返回不同的輸出?

我有一個使用crypto.createHash生成md5散列的node.js模塊。

最近我留意到,crypto模塊產生的散列是在新的版本有所不同:

代碼

require('crypto').createHash('md5').update('¥').digest('hex') 

Node.js的v0.10.0

輸出:ab3af8566ddd20d7efc9b314abe90755

個Node.js的V6.1.0

輸出:07625e142e4ac5961de57472657a88c1

問題

我想知道是什麼原因,在新的版本,我該怎麼解決這個問題?

更新

在GitHub上類似的問題:

回答

17

在節點V6 +一些投入計算不同的哈希比以前的版本的節點。

基本上,當您將字符串傳遞給.update()時,使用v6之前的節點版本時,默認編碼爲binary,但對於節點v6,其更改爲utf-8

例如,藉此代碼:

require('crypto').createHash('md5').update('¥').digest('hex') 

此輸出在節點6.

在節點ab3af8566ddd20d7efc9b314abe90755預6和07625e142e4ac5961de57472657a88c1如果要節點6到輸出相同的預6版本,你要告訴.update()使用binary編碼:

require('crypto').createHash('md5').update('¥', 'binary').digest('hex') 

或周圍的其他方式(使節點前6輸出的同6):

require('crypto').createHash('md5').update('¥', 'utf-8').digest('hex') 
+0

是這些編碼(二進制/ utf-8)是否按字符內字節順序不同? –

+1

@vp_arth沒有太多字節_order_,但它們以字節表示的方式不同。我認爲'binary'是拉丁-1編碼(它可以表示的字符數量有限,我猜這是爲什麼默認爲Node v6更改爲'utf-8'的原因)。 – robertklep

相關問題