如何在 R 中生成随机的 64 位十六进制数?
How to generate random 64-digit hexadecimal number in R?
要在区块链应用程序中应用,我需要在 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 次方(.dec.to.hex(abs(ceiling(rnorm(1) * 1e8)))
是 7 或 8 个十六进制数。10*7 >= 64
)。
library(fBasics)
strtrim(paste(sapply(1:10, function(i) .dec.to.hex(abs(ceiling(rnorm(1) * 1e8)))), collapse=""), 64)
# 0397601803C22E220509810703BDE2300460EA80322F000CF50ABD0226F27009
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"
要在区块链应用程序中应用,我需要在 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 次方(.dec.to.hex(abs(ceiling(rnorm(1) * 1e8)))
是 7 或 8 个十六进制数。10*7 >= 64
)。
library(fBasics)
strtrim(paste(sapply(1:10, function(i) .dec.to.hex(abs(ceiling(rnorm(1) * 1e8)))), collapse=""), 64)
# 0397601803C22E220509810703BDE2300460EA80322F000CF50ABD0226F27009
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"