python中的十六进制到字符串格式转换

Evg*_*eny 3 python string

我曾经用以下方式生成随机字符串(现在我已切换到此方法).

key = '%016x' % random.getrandbits(128)
Run Code Online (Sandbox Code Playgroud)

这种方式生成的密钥通常是32个字符的字符串,但是一旦我有31个字符.

这是我没有得到的:为什么它是32个字符,而不是16个字符?一个十六进制数字不能打印一个字符吗?

所以,如果我要求%016x- 不应该期望十六个字符可能带有前导零吗?

为什么字符串legth并不总是一样?

测试用例

import random
import collections
stats = collections.defaultdict(int)
for i in range(1000000):
    key = '%016x' % random.getrandbits(128)
    length = len(key)
    stats[length] += 1

for key in stats:
    print key, ' ', stats[key]
Run Code Online (Sandbox Code Playgroud)

打印:

32   937911
27   1
28   9
29   221
30   3735
31   58123
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 6

是的,但你正在使用的格式没有截断 - 你生成128个随机位,这需要(通常)32个十六进制数字来显示,并且%016意味着至少16个十六进制数字,但不只是丢掉额外的你需要显示所有128位数字.如果那是你真正需要的,为什么不生成64个随机位?随机生成器的工作量减少,没有格式化问题.

为了满足您的好奇心,长度偶尔为31位,因为16位中的1位时间前4位将全部为0; 实际上在256中有1次,所有前8位都是0,所以你只能获得30位数等等.你只需要16位数字,所以格式化的数量最少> = 16且不需要你没有要求的截断.