2015-07-11 103 views
-1

我正在尝试将下面的python脚本翻译为R,但我遇到了困难,它反映了我对Python或R不熟悉的事实。如何将Python中的哈希函数转换为R

这里是我的Python:

import hashlib, hmac 
print hmac.new('123456', 'hello'.encode('utf-8'),hashlib.sha256).digest() 

当我运行这在Python,我得到一个消息,说标准输出为空。

问题:我在做什么错?

下面是我使用的是什么样的R

library('digest') 
hmac('123456','hello', algo='sha256', serialize=FALSE) 

我的问题了R代码为:

  1. 如何编码成UTF-8 R.我找不到包。
  2. 什么是正确的参数设置serialize和原始的R给定我想匹配上面的Python函数(一旦它的工作)的输出。

回答

2

如果要获取R中散列的字节,请设置raw=TRUE。然后,你可以写出来的二进制罚款

library('digest') 
x <- hmac('123456', enc2utf8('hello'), algo='sha256', serialize=FALSE, raw=TRUE) 
writeBin(x, "Rout.txt") 

如果你不输出文本,编码无所谓。这些是原始字节。输出中唯一不同的是Python打印似乎正在添加一个新的行字符。如果我hexdump都在R文件,我看到

0000000 ac 28 d6 02 c7 67 42 4d 0c 80 9e de bf 73 82 8b 
0000010 ed 5c e9 9c e1 55 6f 4d f8 e2 23 fa ee c6 0e dd 
+0

实际上,我试图创建亚马逊AWS签名的签名,我试图按照此作为一个例子:HTTP://docs.aws.amazon。 com/general/latest/gr/sigv4-signed-request-examples.html – Mutuelinvestor

+0

那么这是如何产生影响的呢? – MrFlick

+0

我认为这可能会阻止编码。这个例子似乎需要四个不同的字符串,并建立到最后的签名。我相信前三个是Raw,最后一个转换为十六进制。 – Mutuelinvestor