From 3fcf0029945d8c6f866fdbb98517136999d7be7e Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 8 Dec 2010 01:13:53 +0000 Subject: [PATCH] Update whatsnew. Salt the random number seed. --- Doc/whatsnew/3.2.rst | 18 ++++++++++++------ Lib/random.py | 11 +++++++---- Lib/test/test_random.py | 4 ++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index b2fea5d15e7..e17292c3548 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -125,8 +125,8 @@ Example of the parser's automatically generated help:: >>> parser.parse_args('-h'.split()) - usage: tmp_argparse_example.py [-h] -u USER - {deploy,start,stop} HOSTNAME [HOSTNAME ...] + usage: manage_cloud.py [-h] -u USER + {deploy,start,stop} HOSTNAME [HOSTNAME ...] Manage servers @@ -321,10 +321,10 @@ module:: PEP written by Barry Warsaw. -Email 5.1 -========= +Email +===== -The email package is extended to be able to parse and generate email messages +The email package has been extended to parse and generate email messages in bytes format. * New functions :func:`~email.message_from_bytes` and @@ -832,6 +832,7 @@ New, Improved, and Deprecated Modules (Contributed by Rodolpho Eckhardt and Nick Coghlan, :issue:`10220`.) +.. XXX: notes on new random.seed() version 2 .. XXX: Create a new section for all changes relating to context managers. .. XXX: Various ConfigParser changes .. XXX: Mention inspect.getattr_static (Michael Foord) @@ -902,7 +903,7 @@ New, Improved, and Deprecated Modules platbase = "C:\Python32" prefix = "C:\Python32" projectbase = "C:\Python32" - py_version = "3.2b1" + py_version = "3.2" py_version_nodot = "32" py_version_short = "3.2" srcdir = "C:\Python32" @@ -1151,3 +1152,8 @@ require changes to your code: * The :func:`sys.setfilesystemencoding` function was removed because it had a flawed design. + + * The :func:`random.seed` function and method now performing salting for + string seeds. To access the previous version of *seed* in order to + reproduce Python 3.1 sequences, set the *version* argument to *1*, + ``random.seed(s, version=1)``. diff --git a/Lib/random.py b/Lib/random.py index 83a070cd325..7f63388f85d 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -43,6 +43,7 @@ from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin from os import urandom as _urandom import collections as _collections +from hashlib import sha512 as _sha512 __all__ = ["Random","seed","random","uniform","randint","choice","sample", "randrange","shuffle","normalvariate","lognormvariate", @@ -110,10 +111,12 @@ class Random(_random.Random): import time a = int(time.time() * 256) # use fractional seconds - if version == 2 and isinstance(a, (str, bytes, bytearray)): - if isinstance(a, str): - a = a.encode("utf8") - a = int.from_bytes(a, 'big') + if version == 2: + if isinstance(a, (str, bytes, bytearray)): + if isinstance(a, str): + a = a.encode("utf8") + a += _sha512(a).digest() + a = int.from_bytes(a, 'big') super().seed(a) self.gauss_next = None diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index feb52a59da8..776d0c4163e 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -246,8 +246,8 @@ class MersenneTwister_TestBasicOps(TestBasicOps): '0x1.1ebb4352e4c4dp-1', '0x1.1a7422abf9c11p-1']) self.gen.seed("the quick brown fox", version=2) self.assertEqual([self.gen.random().hex() for i in range(4)], - ['0x1.1294009b9eda4p-2', '0x1.2ff96171b0010p-1', - '0x1.459e0989bd8e0p-5', '0x1.8b5f55892ddcbp-1']) + ['0x1.1239ddfb11b7cp-3', '0x1.b3cbb5c51b120p-4', + '0x1.8c4f55116b60fp-1', '0x1.63eb525174a27p-1']) def test_setstate_first_arg(self): self.assertRaises(ValueError, self.gen.setstate, (1, None, None))