Вопрос по random, python – Что более случайное, хэшлиб или случайное?

18

Я работаю над проектом с другом, в котором нам нужно создать случайный хеш. Прежде чем у нас было время для обсуждения, мы оба придумали разные подходы, и, поскольку они используют разные модули, я хотел спросить всех вас, что было бы лучше - если есть такая вещь.

<code>hashlib.sha1(str(random.random())).hexdigest()
</code>

или же

<code>os.urandom(16).encode('hex')
</code>

Печатание этого вопроса заставило меня думать, что второй метод лучше. Простое лучше, чем сложное. Если вы согласны, насколько это надежно для «случайного» выбора? генерировать хеши? Как бы я проверить это?

Ваш Ответ

5   ответов
2

вам следует использовать

import uuid
uuid.uuid4().hex

https://docs.python.org/3/library/uuid.html

38

Это решение:

os.urandom(16).encode('hex')

лучший, так как этоиспользует ОС генерировать случайность, котораяshould быть пригодным для криптографических целей (зависит от реализации ОС).

random.random() генерируетпсевдослучайные значения.

Хэширование случайного значения не добавляет никакой новой случайности.

Error: User Rate Limit Exceededdocs.python.org/2/library/random.html#random.SystemRandom
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Flowpoke
Error: User Rate Limit Exceededbase64.b64encode(os.urandom(16))
Error: User Rate Limit Exceededos.urandomError: User Rate Limit Exceeded
7

random.random() является генератором псевдо-радмом, то есть числа генерируются из последовательности. если ты позвонишьrandom.seed(some_number), то после этого сгенерированная последовательность всегда будет одинаковой.

os.urandom() получить случайные числа из операционной системы rng, который использует пул энтропии для сбора реальных случайных чисел, обычно случайных событий от аппаратных устройств, существуют даже случайные специальные генераторы энтропии для систем, в которых генерируется много случайных чисел.

в системе unix традиционно есть два генератора случайных чисел:/dev/random а также/dev/urandom, вызывает первый блок, если энтропии недостаточно, тогда как при чтении/dev/urandom и не имеется достаточного количества энтропийных данных, он использует псевдозвонок и не блокирует.

поэтому использование обычно зависит от того, что вам нужно: если вам нужно несколько равномерно распределенных случайных чисел, то встроенного prng должно быть достаточно. для криптографического использования всегда лучше использовать реальные случайные числа.

2

как известно, трудна - однако я бы выбрал второй метод, но ТОЛЬКО (или, насколько это только возможно), для этого случая, когда хеш засевается случайным числом.

Весь смысл хэшей в том, чтобы создать число, котороеvastly different основанный наslight differences in input, Для вашего случая использования случайность ввода должна делать. Однако, если вы хотите хэшировать файл и обнаруживать разницу в один байт, то тогда, когда светит алгоритм хэширования.

Мне просто любопытно: зачем вообще использовать алгоритм хеширования? Кажется, что вы ищете чисто случайное число, и существует множество библиотек, генерирующих uuid, которые имеют гораздо более сильные гарантии уникальности, чем генераторы случайных чисел.

7

чем первое. Предполагая, что качество источника случайных битов будет одинаковым дляos.urandom а такжеrandom.random:

In the second solution you are fetching 16 bytes = 128 bits worth of randomness In the first solution you are fetching a floating point value which has roughly 52 bits of randomness (IEEE 754 double, ignoring subnormal numbers, etc...). Then you hash it around, which, of course, doesn't add any randomness.

Что еще более важно, качество случайности исходит отos.urandom ожидается и задокументировано, что будет намного лучше, чем случайностьrandom.random. os.urandom"строка документа говорит" подходит для криптографического использования ".

Похожие вопросы