шестнадцатеричное преобразование форматирования строки в python - PullRequest
3 голосов
/ 10 июля 2009

Раньше я генерировал случайную строку следующим образом (теперь я переключился на этот метод ).

key = '%016x' % random.getrandbits(128)

Ключ, сгенерированный таким образом, чаще всего представляет собой строку из 32 символов, но как только у меня появляется 31 символ.

Вот чего я не понимаю: почему это 32 символа, а не 16 ? Разве одна шестнадцатеричная цифра не берет один символ для печати?

Так что, если я попрошу %016x - разве нельзя ожидать шестнадцати символов с возможными ведущими нулями?

Почему длина строки не всегда одинакова?

Контрольный пример

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]

Печать:

32   937911
27   1
28   9
29   221
30   3735
31   58123

Ответы [ 2 ]

6 голосов
/ 10 июля 2009

Да, но формат, который вы используете, не усекается - вы генерируете 128 случайных битов, для отображения которых требуется (обычно) 32 шестнадцатеричных числа, а %016 означает по крайней мере 16 шестнадцатеричных цифр, но просто выбросьте лишние, которые вам нужны, чтобы показать все это 128-битное число. Почему бы не генерировать только 64 случайных бита, если это то, что вам действительно нужно? Меньше работы для генератора случайных чисел И никаких проблем с форматированием.

Чтобы удовлетворить ваше боковое любопытство, длина иногда составляет 31 цифру, потому что 1 раз из 16 верхние 4 бита будут равны 0; на самом деле 1 раз в 256 все 8 старших бит будут равны 0, поэтому вы получите только 30 цифр и т. д. Вы запросили только 16 цифр, поэтому форматирование даст наименьшее число, равное> = 16 и не требующее усечение, которое вы не просили.

3 голосов
/ 10 июля 2009

Каждый шестнадцатеричный символ от 0 до F содержит 4 бита информации или половину байта. 128 бит - это 16 байтов, и поскольку для печати байта требуется два шестнадцатеричных символа, вы получите 32 символа. Таким образом, ваша строка формата должна быть '%032x', которая всегда будет генерировать 32-символьную строку, а не короче.

jkugelman$ cat rand.py
#!/usr/bin/env python

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

for key in stats:
    print key, ' ', stats[key]
jkugelman$ python rand.py
32   1000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...