在ruby中生成最多20个字节的随机无符号值的最紧凑方法是什么?

时间:2014-02-15 00:43:16

标签: ruby random

对于rails应用程序,我正在生成由我自己的CA签名的X509证书。据我所知,根据X509规范,生成的证书的序列号在CA中应该是唯一的。

在我看来,我应该能够使用SecureRandom生成一个在统计上不太可能发生冲突的随机20个字节,而不是跟踪已经发布的序列号,将其转换为正{{1}并将其设置为我生成的任何证书的序列号。

最简洁的方法是什么?

到目前为止,这是我提出的:

Bignum

1 个答案:

答案 0 :(得分:2)

改进:

SecureRandom.random_bytes(20).unpack('C*').inject { |r,n| r << 8 | n }

使用hex(20).unpack('c*')的问题在于它将每个十六进制数字解释为一个字节,因此您没有获得完整的8位熵,而且它会给您40个十六进制数字,因此最终数字不必要地长。比较此方法生成的长度与问题。


第二回答

已经有了直接的功能:

SecureRandom.random_number(1<<160)

160位= 20个字节。