如何在R中生成随机的64位十六进制数?

如何在R中生成随机的64位十六进制数?,r,random,numbers,hex,blockchain,R,Random,Numbers,Hex,Blockchain,要在区块链应用程序中应用,我需要在R中生成随机的64位十六进制数 我认为,由于计算机的容量,一次获得这样一个64位的十六进制数相当麻烦,也许是不可能的 所以,我认为我应该生成具有较低数字的随机十六进制数,并将它们组合在一起,以获得随机的64位十六进制数 我已接近解决方案: library(fBasics) .dec.to.hex(abs(ceiling(rnorm(1) * 1e6))) 生成随机十六进制数。问题是,在某些情况下,我得到6位十六进制数,在某些情况下,我得到7位十六进制数。因此,

要在区块链应用程序中应用,我需要在R中生成随机的64位十六进制数

我认为,由于计算机的容量,一次获得这样一个64位的十六进制数相当麻烦,也许是不可能的

所以,我认为我应该生成具有较低数字的随机十六进制数,并将它们组合在一起,以获得随机的64位十六进制数

我已接近解决方案:

library(fBasics)
.dec.to.hex(abs(ceiling(rnorm(1) * 1e6)))
生成随机十六进制数。问题是,在某些情况下,我得到6位十六进制数,在某些情况下,我得到7位十六进制数。因此,首先解决这个问题

有什么想法吗

library(fBasics)
strtrim(paste(sapply(1:11, function(i) .dec.to.hex(abs(ceiling(rnorm(1) * 1e6)))), collapse=""), 64)
# 08FBFA019B4930E2AF707AFEE08A0F90D765E05757607609B0691190FC54E012
让我们检查一下:

nchar(strtrim(paste(sapply(1:11, function(i) .dec.to.hex(abs(ceiling(rnorm(1) * 1e6)))), collapse=""), 64)) # 64

.dec.to.hex()
的最大参数是
.dec.to.hex(2^30.99999…9)
。 因此,问题归结为
2^30。99999=2147468763
10的幂是多少

2147468763=2.147468763e9

1e9<2.147468763e9。因此,第9次权力。但是,
rnorm(1)
可能产生“
>5
”。为安全起见,请使用8次方(
12月到.hex(abs(天花板(rnorm(1)*1e8))
为7或8个六位数。
10*7>=64

10次迭代,而不是11次;因此,操作要少一点

nchar(strtrim(paste(sapply(1:10, function(i) .dec.to.hex(abs(ceiling(rnorm(1) * 1e8)))), collapse=""), 64))
# 64

您可以简单地对每个数字进行采样并将它们粘贴在一起

set.seed(123)
paste0(sample(c(0:9, LETTERS[1:6]), 64, T), collapse = '')
## [1] "4C6EF08E87F7A91E305FEBAFAB8942FEBC07C353266522374D07C1832CE5A164"

.dec.to.hex
记录在哪里?假设
dec
decimal
的缩写,它似乎是一个命名奇怪的函数:R中的数字肯定不是真的存储在decimal中吗?(或者它的目的是将十进制字符串转换为十六进制?)“也许不可能。”当然不是不可能,尽管用R来拼写可能会很困难。听起来好像你在寻找与Python的
hex(random.getrandbits(256))
相当的R。是吗?@MarkDickinson
fBasics::.dec.to.hex
揭示了它的内容:
函数(b){ans=.chcode(b,base.in=10,base.out=16)ans}
@MarkDickinson我不懂Python。因此,我不能对这种比较说什么。这种方法不会给出均匀分布的十六进制字符串:一些长度为64的十六进制字符串比其他字符串更可能出现。也许这就是你想要的,但是如果你想要一个统一的分布,我建议使用
runif
(加上上限或下限)来生成
[0,2**52)
范围内的整数(每个都给出13个十六进制数字)相反。你只需要5次这样的调用就可以得到65个十六进制数字;然后你可以扔掉最后一个数字。我意识到了这一点。
strtrim
上面的解决方案总是生成以0开头的十六进制数。但是,有64位十六进制数以a,b,…,f开头。此外,上面64位十六进制中的子部分也以0开头。这会破坏你的统一性声明。我当然想要均匀分布。@MarkDickinson,通过5*13-1=64打猎是不可能的,因为
.dec.to.hex
甚至不能完成
.dec.to.hex(2^31)
,忘记
.dec.to.hex(2^52)
。同时非常优雅和简单!
set.seed(123)
paste0(sample(c(0:9, LETTERS[1:6]), 64, T), collapse = '')
## [1] "4C6EF08E87F7A91E305FEBAFAB8942FEBC07C353266522374D07C1832CE5A164"