标题说明了一切......
我知道我可以使用digest::digest
来计算字符串的md5
:
digest::digest('string', algo = "md5", serialize = FALSE)
但是,我无法将这个(大概是十六进制)值转换为整数(或大整数)以用于模数目的...
我尝试使用as.hexmode
和strtoi
都失败了。
> as.hexmode(digest("1", algo = "md5", serialize = FALSE))
Error in as.hexmode(digest("1", algo = "md5", serialize = FALSE)) :
'x' cannot be coerced to class "hexmode"
> strtoi(digest("1", algo = "md5", serialize = FALSE), base = 16L)
[1] NA
答案 0 :(得分:3)
问题是结果数字太高而无法表示为整数,strtoi
返回NA。由于模数只需要较小的数字,为什么不直接转换md5-string的结尾?此示例与使用Rmpfr的下一个(正确)解决方案的结果不同。
x <- digest::digest('string', algo = "md5", serialize = FALSE)
strtoi(substr(x, nchar(x)-4, nchar(x)), base=16)
另一个解决方案是使用Rmpfr库,它支持大整数的转换。这样可以得到正确的转换结果(但需要额外的包):
library(Rmpfr)
x <- digest::digest('string', algo = "md5", serialize = FALSE)
x <- mpfr(x, base=16)
x %% 1000