Python中的随机32位十六进制数字

时间:2016-04-12 17:28:23

标签: python hex

我正在尝试找到一种很好的方法来生成一个随机的32位十六进制序列,并从10 * 78之类的大数字中获取其随机性。

对于Python代码,我也发现了这个:

        <a href="images/{Imagini} " class="gall_item"><img src="images/${Imagini}" alt=""></a>
        <div class="gall_bot">
        <div class="text1"><a href="#">${Nume} </a></div>
        ${Descriere} 
        <br>
        <button type = "submit" class = "btn" >more</button>
        </div>
      </div>
    </div>
  </div>

这会产生64位十六进制字符串,但有时结果是63或甚至61个字符,我不知道为什么?我需要它每次都准确地返回64。

我需要帮助调整上面的代码,以便它总是只返回64。我不太了解&#34;%030x&#34;部分工作。

我也试过生产一个更长的十六进制字符串并缩短它:

ran = random.randrange(10**80)
myhex = "%030x" % ran

但我仍然看到返回的字符串少于64个。

最后我只需要从大数字派生的64个十六进制字符串,如10 * 78,每次返回。

解决方案我选择了

myhex = myhex[:64]

似乎@ScottMillers的答案是我需要找到答案的关键,所以我选择他的答案作为解决方案,但是想在这里发布我的最终代码。

谢谢大家

8 个答案:

答案 0 :(得分:4)

"%030x"表示使用至少 30位数显示相关值,必要时在前面填充0&#39;由于您的数字几乎总是比这大,所以这对您没有多大帮助。

听起来你需要"%064x"

答案 1 :(得分:4)

UUID模块可以返回32个十六进制数字对象:

import uuid
uuid.uuid4().hex
# '7dccf8a43a6c4e018caadacdb2d0f6f0'

答案 2 :(得分:3)

在现代Python发行版中,新的库secrets使其变得容易,并且可能正是您所需要的。从文档中:

  

秘密模块用于生成适合于管理数据(例如密码,帐户身份验证,安全令牌和相关秘密)的具有密码学意义的强随机数。

     

特别是,应优先使用随机模块中默认的伪随机数生成器(默认用于模型和仿真,而非安全性或加密)中的秘密。

对于Python 3.6及更高版本,请尝试以下操作:

import secrets
secrets.token_hex(32)
#'17450056b398cbeda1fa7e4fc25d4fb169ade2b1266892e2cecab56b12fb900b'

https://docs.python.org/3/library/secrets.html#module-secrets

答案 3 :(得分:1)

您可以使用os.urandom代替hexdump。 Python 2.7:

import os
num_digits = 32
myhex = os.urandom(num_digits / 2).encode('hex')

Py3.4 +:

import os, codecs
num_digits = 32
myhex = codecs.encode(os.urandom(num_digits / 2), 'hex').decode()

答案 4 :(得分:0)

没有“十六进制数”这样的东西;只有相同数字的不同表示(十进制中的10表示十六进制为0xA,二进制为0b1010,但它仍然是相同的数字)。

  

这会产生64位十六进制字符串,但有时结果是63或甚至61个字符,我不知道为什么?我需要它每次都准确地返回64。

所以:我请你给我一个0以上1000以下的随机数;这个数字有多少位数?

右。它可以有一个,两个或三个数字,最可能的情况是三个数字(1000个以下的900个三位数字,但只有90个两位数字和9个一位数字)。

显然,你只需要在前面填0!

  

最后我只需要从大数字派生的64个十六进制字符串,如10 * 78,每次返回。

你需要考虑随机意味着什么。如果从0..F中的均匀分布中抽取每一个数字都没问题,那么为什么不只是将16个十二次模具抛出64次并连接结果呢? Python使这非常容易

import random
hexdigits = "0123456789ABCDEF"
random_digits = "".join([ hexdigits[random.randint(0,0xF)] for _ in range(64) ])

修改

在下面的评论中,OP表示他希望使用该随机字符串来种子比特币私钥生成。

从不构建自己的播种机,除非您真的是该领域的专家。所以,虽然我相信这些1024位(实际上,这是十六进制数字的64位数字)的信息是随机的,但我不会声称这足以用于加密目的

不要自己实施加密,也不要干涉种子生成,以免你了解随机,数字,加密和RNG,计算机安全研究和可能的攻击向量。 根本不

答案 5 :(得分:0)

对于内部零填充,我们可以使用zfill选项。

例如: 设备='14AB'

  
    

device.zfill(8)     '000014AB'     device.zfill(64)     '00000000000000000000000000000000000000000000000000000000000000000000000014AB'

  

答案 6 :(得分:0)

为什么不为 python2 编写可读的代码?

import random
value = "%032x" % random.randrange(16**32)

(十六进制是 16 进制)

答案 7 :(得分:-1)

我会尝试这样的事情:

mylist = [0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F]
number = ""

def randomhex():
    global mylist, number
    while len(number) < 32:
        number = number + random.choice(mylist)

如果你想要它作为数字,而不是字符串只需使用eval()。