2015-07-03 56 views
2

我不是Python程序員,但我想將一些Python代碼翻譯爲R.這塊我遇到的麻煩Python代碼是:Python的hashlib.sha256(x).hexdigest()相當於Rs摘要(x,algo =「sha256」)

hashlib.sha256(x).hexdigest() 

我這段代碼的解釋是,該功能會使用SHA256算法計算x的哈希值,並以十六進制返回值。

鑑於這種解釋,我使用下列R-功能:

digest(x, algo="sha256", raw=FALSE) 

基於我雖然的R有限的知識,我對Python的hashlib功能在線閱讀兩大功能應該產生相同的結果,但他們不是。  

我錯過了什麼,或者我是否使用了錯誤的R函數。

回答

7

是,無論是Python和R樣本代碼返回SHA256哈希的十六進制表示消化所傳遞的數據。

你需要切換R中的序列化的,否則你的digest()包首先創建字符串的序列化而不是僅爲字符數據計算散列;設置serializeFALSE

> digest('', algo="sha256", serialize=FALSE) 
[1] "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" 
> digest('hello world', algo="sha256", serialize=FALSE) 
[1] "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" 

這些匹配他們的Python當量:

>>> import hashlib 
>>> hashlib.sha256('').hexdigest() 
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 
>>> hashlib.sha256('hello world').hexdigest() 
'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9' 

如果散列然後仍然R和Python的之間不同,則你的數據是不同。這可能在行尾是一個微妙的換行符,或者在開始時是字節順序標記。

在Python中,檢查print(repr(x))的輸出以將數據表示爲Python字符串文字;這會將不可打印的字符顯示爲轉義序列。我確定R有類似的調試工具。在使用交互模式時,R和Python都會將字符串值作爲表示形式回顯。