[Tutor] Q about .join() Thanks!
Peter Otten
__peter__ at web.de
Tue Feb 14 03:50:04 EST 2017
Danny Yoo wrote:
> Moreover, most implementations *deliberately* randomize their iteration
> order to avoid a particular kind of hash collision attack out there in
> the wild. See:
In CPython the hash() of a string may change between different runs to fend
off hash collision attacks, but that does not necessarily change the order
of iteration:
In Python 3.4 for example both order and hash value change
$ python3.4 -c 'd = dict.fromkeys("foo bar baz".split()); print(hash("foo"),
*d)'
-1599197652882818545 baz bar foo
$ python3.4 -c 'd = dict.fromkeys("foo bar baz".split()); print(hash("foo"),
*d)'
-7773300350121034240 foo bar baz
$ python3.4 -c 'd = dict.fromkeys("foo bar baz".split()); print(hash("foo"),
*d)'
4096077922251392823 baz bar foo
In Python 3.6 on the other side the hash values still change, but
(insertion) order is preserved:
$ python3.6 -c 'd = dict.fromkeys("foo bar baz".split()); print(hash("foo"),
*d)'
22453670082131454 foo bar baz
$ python3.6 -c 'd = dict.fromkeys("foo bar baz".split()); print(hash("foo"),
*d)'
4601604916521659267 foo bar baz
$ python3.6 -c 'd = dict.fromkeys("foo bar baz".split()); print(hash("foo"),
*d)'
5190466601789110813 foo bar baz
So if the OP had used Python 3.6 she would have seen the behaviour she
expected. However, quoting
<https://docs.python.org/dev/whatsnew/3.6.html#new-dict-implementation>
"""
The order-preserving aspect of this new [dict] implementation is considered
an implementation detail and should not be relied upon
"""
More information about the Tutor
mailing list