Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将字符串转换为整数以进行模运算_R_Type Conversion - Fatal编程技术网

R 将字符串转换为整数以进行模运算

R 将字符串转换为整数以进行模运算,r,type-conversion,R,Type Conversion,我想通过模运算将md5哈希字符串映射到工作日数(0-6)。因此,我需要将字符哈希转换为整数(数字)。我还没有找到以字节形式而不是ascii字符串(通过digestpackage)输出哈希的方法。任何带有基R或不同方法的提示都值得欣赏。如果您真的想这样做,您将需要多精度算术,因为单个md5哈希有128位,太大了,无法放入正常整数值中。这可以使用包来完成 我们来分析一下: 我想将这个算法设计成矢量化,并决定使用内置的字母矢量作为26个任意输入值进行演示。不幸的是,完全矢量化算法(即没有隐藏循环)的

我想通过模运算将md5哈希字符串映射到工作日数(0-6)。因此,我需要将字符哈希转换为整数(数字)。我还没有找到以字节形式而不是ascii字符串(通过
digest
package)输出哈希的方法。任何带有基R或不同方法的提示都值得欣赏。

如果您真的想这样做,您将需要多精度算术,因为单个md5哈希有128位,太大了,无法放入正常整数值中。这可以使用包来完成

我们来分析一下:


我想将这个算法设计成矢量化,并决定使用内置的
字母
矢量作为26个任意输入值进行演示。不幸的是,完全矢量化算法(即没有隐藏循环)的梦想马上破灭了,因为
digest()
由于某种原因没有矢量化,这就是为什么我必须在这里使用
sapply()
来生成与输入相对应的md5哈希向量


将哈希拆分为字符向量,每个元素为哈希的一个十六进制数字。我们现在有一个26个字符向量的列表


一次处理一个字符向量。深入函数(将给出与输入字符串
'a'
对应的
x
值的示例输出):

通过查找十六进制数字序列(
c(0:9,字母[1:6])中的索引并减去一,将每个数字的值返回为普通的旧整数


转换为大整数,这是我们将要做的算术所必需的


将哈希值视为一个大端十六进制数,将每个数字值乘以其位置值


将每个位值加权的数字值相加,得到哈希的bigz表示形式

这就完成了
lappy()
函数。因此,从
lappy()
调用出来的是一个对应于散列的bigz值列表:

lapply(..., function(x) ... )
## $a
## Big Integer ('bigz') :
## [1] 24560512346470571536449760694956189688
##
## $b
## Big Integer ('bigz') :
## [1] 295010738308890763454498908323798711226
##
## $c
## Big Integer ('bigz') :
## [1] 146851381511772731860674382282097773009
## ...

这将“取消”列表。注意:我尝试了
sapply()
而不是
lappy()
,或者
unlist()
,但都不起作用。这可能与bigz类有关,可能与bigz值的向量实际上被奇怪地编码为单个原始向量这一事实有关


最后我们可以取7的模数



最后一步是从bigz转换回普通的旧整数。

检查
charToRaw
函数。好的,谢谢你的函数。我不能直接将原始输出用于模运算,因此我必须将输出转换为整数/数字?是的。但请记住,生成的数字的分布可能并不均匀,因为某些值比其他值具有更高的绘制概率。例如,检查
as.integer(charToRaw(“0123456789abcdef”))%%7
,您将看到,例如,数字5只生成一次,而其他数字生成3或2次。谢谢,这正是我所关心的。。。
sapply(letters,digest,'md5')
##                                  a                                  b                                  c ...
## "127a2ec00989b9f7faf671ed470be7f8" "ddf100612805359cd81fdc5ce3b9fbba" "6e7a8c1c098e8817e3df3fd1b21149d1" ...
strsplit(...,'')
## $a
##  [1] "1" "2" "7" "a" "2" "e" "c" "0" "0" "9" "8" "9" "b" "9" "f" "7" "f" "a" "f" "6" "7" "1" "e" "d" "4" "7" "0" "b" "e" "7" "f" "8"
##
## $b
##  [1] "d" "d" "f" "1" "0" "0" "6" "1" "2" "8" "0" "5" "3" "5" "9" "c" "d" "8" "1" "f" "d" "c" "5" "c" "e" "3" "b" "9" "f" "b" "b" "a"
##
## $c
##  [1] "6" "e" "7" "a" "8" "c" "1" "c" "0" "9" "8" "e" "8" "8" "1" "7" "e" "3" "d" "f" "3" "f" "d" "1" "b" "2" "1" "1" "4" "9" "d" "1"
## ...
lapply(..., function(x) ... )
match(x,c(0:9,letters[1:6]))-1
##  [1]  1  2  7 10  2 14 12  0  0  9  8  9 11  9 15  7 15 10 15  6  7  1 14 13  4  7  0 11 14  7 15  8
as.bigz(...)
## Big Integer ('bigz') object of length 32:
##  [1] 1  2  7  10 2  14 12 0  0  9  8  9  11 9  15 7  15 10 15 6  7  1  14 13 4  7  0  11 14 7  15 8
...*as.bigz(16)^((length(x)-1):0)
## Big Integer ('bigz') object of length 32:
##  [1] 21267647932558653966460912964485513216 2658455991569831745807614120560689152  581537248155900694395415588872650752   51922968585348276285304963292200960    649037107316853453566312041152512
##  [6] 283953734451123385935261518004224      15211807202738752817960438464512       0                                      0                                      2785365088392105618523029504
## [11] 154742504910672534362390528            10880332376531662572355584             831136500985057557610496               42501298345826806923264                4427218577690292387840
## [16] 129127208515966861312                  17293822569102704640                   720575940379279360                     67553994410557440                      1688849860263936
## [21] 123145302310912                        1099511627776                          962072674304                           55834574848                            1073741824
## [26] 117440512                              0                                      720896                                 57344                                  1792
## [31] 240                                    8
sum(...)
## Big Integer ('bigz') :
## [1] 24560512346470571536449760694956189688
lapply(..., function(x) ... )
## $a
## Big Integer ('bigz') :
## [1] 24560512346470571536449760694956189688
##
## $b
## Big Integer ('bigz') :
## [1] 295010738308890763454498908323798711226
##
## $c
## Big Integer ('bigz') :
## [1] 146851381511772731860674382282097773009
## ...
do.call(c,...)
## Big Integer ('bigz') object of length 26:
##  [1] 24560512346470571536449760694956189688  295010738308890763454498908323798711226 146851381511772731860674382282097773009 277896596675540352347406615789605003835 196274166648971101707441276945175337351
##  [6] 152164057440943545205375583549802787690 177176961461451259509149953911555923867 104722841650969351697149582356678916643 338417919426764038104581950237023359466 337938589168387959049175020406476846763
## [11] 182882473465429367490220828342074920857 80661780033646501757972845962914093977  251563583963884775614900275564391350478 279860001817578054753205218523665183571 158142488666995307556311659134646734337
## [16] 116423801372716526262639744414150237351 97172586736798383425273805088952414146  316382305028166656556246910315962582893 245775506345085992020540282526076959865 96713787940004003047734284080139522561
## [21] 227309401343419671779216095382349119699 250431221767618781785406207793096585421 33680856367414392588062933086110875192  119974848773126933055729663395967301868 296965764652868210844163281547943654188
## [26] 118199003122415992890118393158735259681
...%%7
## Big Integer ('bigz') object of length 26:
##  [1] 3 2 1 1 5 5 5 5 1 4 4 6 5 3 5 4 0 2 0 4 5 4 6 3 6 1
as.integer(...)
##  [1] 3 2 1 1 5 5 5 5 1 4 4 6 5 3 5 4 0 2 0 4 5 4 6 3 6 1