Skip to content

Commit c6ce8fb

Browse files
miss-islingtonMariatta
authored andcommitted
[3.6] bpo-31482: Missing bytes support for random.seed() version 1 (GH-3614) (GH-3659)
(cherry picked from commit 132a7d7)
1 parent 72c05e3 commit c6ce8fb

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

‎Lib/random.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ def seed(self, a=None, version=2):
109109
"""
110110

111111
if version == 1 and isinstance(a, (str, bytes)):
112+
a = a.decode('latin-1') if isinstance(a, bytes) else a
112113
x = ord(a[0]) << 7 if a else 0
113-
for c in a:
114-
x = ((1000003 * x) ^ ord(c)) & 0xFFFFFFFFFFFFFFFF
114+
for c in map(ord, a):
115+
x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
115116
x ^= len(a)
116117
a = -2 if x == -1 else x
117118

‎Lib/test/test_random.py‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,33 @@ def test_bug_27706(self):
423423
['0x1.b0580f98a7dbep-1', '0x1.84129978f9c1ap-1',
424424
'0x1.aeaa51052e978p-2', '0x1.092178fb945a6p-2'])
425425

426+
def test_bug_31482(self):
427+
# Verify that version 1 seeds are unaffected by hash randomization
428+
# when the seeds are expressed as bytes rather than strings.
429+
# The hash(b) values listed are the Python2.7 hash() values
430+
# which were used for seeding.
431+
432+
self.gen.seed(b'nofar', version=1) # hash('nofar') == 5990528763808513177
433+
self.assertEqual([self.gen.random().hex() for i in range(4)],
434+
['0x1.8645314505ad7p-1', '0x1.afb1f82e40a40p-5',
435+
'0x1.2a59d2285e971p-1', '0x1.56977142a7880p-6'])
436+
437+
self.gen.seed(b'rachel', version=1) # hash('rachel') == -9091735575445484789
438+
self.assertEqual([self.gen.random().hex() for i in range(4)],
439+
['0x1.0b294cc856fcdp-1', '0x1.2ad22d79e77b8p-3',
440+
'0x1.3052b9c072678p-2', '0x1.578f332106574p-3'])
441+
442+
self.gen.seed(b'', version=1) # hash('') == 0
443+
self.assertEqual([self.gen.random().hex() for i in range(4)],
444+
['0x1.b0580f98a7dbep-1', '0x1.84129978f9c1ap-1',
445+
'0x1.aeaa51052e978p-2', '0x1.092178fb945a6p-2'])
446+
447+
b = b'\x00\x20\x40\x60\x80\xA0\xC0\xE0\xF0'
448+
self.gen.seed(b, version=1) # hash(b) == 5015594239749365497
449+
self.assertEqual([self.gen.random().hex() for i in range(4)],
450+
['0x1.52c2fde444d23p-1', '0x1.875174f0daea4p-2',
451+
'0x1.9e9b2c50e5cd2p-1', '0x1.fa57768bd321cp-2'])
452+
426453
def test_setstate_first_arg(self):
427454
self.assertRaises(ValueError, self.gen.setstate, (1, None, None))
428455

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
``random.seed()`` now works with bytes in version=1

0 commit comments

Comments
 (0)