我们如何 select 来自 python 中给定十六进制范围的随机十六进制值

How can we select a random hex value from a given hex range in python

如果我有一个十六进制范围 0x2080000000-0x217fffffff,如果我需要 select 这个范围内的随机十六进制数或多个十六进制数,我该如何使用 python?

使用 random 模块中的 randint

from random import randint 

x = randint(0x2080000000, 0x217fffffff)
print(f"Decimal    : {x}\n"
      f"Hexadecimal: {hex(x)}")

上面在闭区间[0x2080000000, 0x217fffffff]中抽取一个随机整数赋值给x。然后它使用 built-in 函数 hex 获取整数 x.

的十六进制表示形式(作为字符串)

示例输出

Decimal    : 140929308832
Hexadecimal: 0x20d00a98a0

多个随机整数


如果需要在闭区间[0x2080000000, 0x217fffffff]内不重复的多个随机整数,可以使用sample:

from random import sample

y = sample(range(0x2080000000, 0x2180000000), 10) 

这 returns 一个 10 元素 list 的随机整数在上述闭区间没有重复。请注意使用 0x2180000000 而不是 0x217fffffff 因为 range(start, stop) 在 half-open 间隔 [start, stop) 中产生整数所以我们需要将 0x217fffffff 添加 1 所以range(0x2080000000, 0x2180000000) 在闭区间 [0x2080000000, 0x217fffffff].

中产生整数

如果不在意重复,可以使用

y = [randint(0x2080000000, 0x217fffffff) for i in range(10)]

创建一个 10 元素 list 的闭区间随机整数(可以重复)。

Cryptographically-secure随机数


如果需要cryptographically-secure随机性,先执行(docs)

from random import SystemRandom

rgen = SystemRandom()

然后,而不是

  • 使用randint(),使用rgen.randint()
  • 使用sample(),使用rgen.sample()

Python 将十六进制存储为一个 int,因此您可以使用 random.randint() 接收两个整数来定义范围和 returns 范围内的整数,然后您可以将生成的整数转换为十六进制。

from random import randint

my_hex = hex(randint(0x2080000000, 0x217fffffff))
print(my_hex)

打印随机十六进制:

0x20c30ad886

要选择几个十六进制数,请使用 random.choices,然后将生成的整数列表转换为十六进制列表

from random import choices

hex_list = [hex(i) for i in choices(range(0x2080000000, 0x217fffffff), k=5)]
print(hex_list)

十六进制数列表

['0x2146f52eae', '0x212b07a57c', '0x20afd61152', '0x20e5ad73b9', '0x21620afcb3']