【问题标题】:How to generate random 64-digit hexadecimal number in R?如何在 R 中生成随机的 64 位十六进制数?
【发布时间】:2018-06-07 03:24:51
【问题描述】:

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

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

所以,我认为我应该生成具有相当低位数的随机十六进制数,并将它们组合(连接)在一起以获得随机的 64 位十六进制数。

我已经接近解决方案了:

library(fBasics)
.dec.to.hex(abs(ceiling(rnorm(1) * 1e6)))

产生随机的十六进制数。问题是在某些情况下,我得到 6 位十六进制数,在某些情况下,我得到 7 位十六进制数。因此,首先解决这个问题。

有什么想法吗?

【问题讨论】:

  • .dec.to.hex 记录在哪里?假设decdecimal 的缩写,它似乎是一个奇怪的命名函数:R 中的数字肯定不是真的 以十进制存储的吗? (或者它的目的是将十进制的 strings 转换为十六进制?)
  • “也许不可能。”当然不是不可能,尽管在 R 中拼写出来可能很尴尬。听起来好像您正在寻找与 Python 的 hex(random.getrandbits(256)) 等效的 R。对吗?
  • @MarkDickinson fBasics::.dec.to.hex 揭示其内容:function (b) { ans = .chcode(b, base.in = 10, base.out = 16) ans }
  • @MarkDickinson 我不懂 Python。因此,对于这种比较,我无话可说。

标签: r random numbers hex blockchain


【解决方案1】:

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

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

【讨论】:

  • 既优雅又简单!
【解决方案2】:

.dec.to.hex() 的最大参数是.dec.to.hex(2^30.99999....9)。 所以,问题归结为2^30.99999=2147468763 10 的幂是多少?

2147468763 = 2.147468763e9

1e9 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

【讨论】:

  • 此方法不会提供均匀分布的十六进制字符串:一些长度为 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)
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2016-02-04
    • 2012-12-09
    相关资源
    最近更新 更多