Здравствуйте, netch80, Вы писали:
N>Но и не запрещено ведь? N>Вспоминаем Python: начиная с 2.7 в вычислении хэша для выбора корзины участвует параметр, случайно выбираемый на старте интерпретатора. До 3.5 включительно он также влиял на порядок перебора штатными средствами (начиная с 3.6 принят порядок вставления, как в Java LinkedHashMap или во всех реализациях в JS). И это намеренно сделано как секьюрити фича.
Вот именно, в питоне наелись этого дерьма, и сделали dict равным OrderedDict, потому что слишком многих это просто задолбало.
Тот факт, что в минорной версии поменяли логику работы, и у большинства людей ничего не изменилось (ну может, безопасники побегали по потолку), говорит о том, что чистота, а тем паче, стабильность, — это востребованно и хорошо.
N>Кто запретит в разных запусках одного и того же кода получать разный порядок перебора? N>ASLR уже есть (виден только на уровне ассемблера, но есть).
К>>Например, в C++ std::sort нестабильный, но чистый. К>>std::unordered_map не даёт гарантий, но опять-таки чистый: два одинаково сформированных мапа (последовательность вызовов reserve и insert) одинаково итерируются.
N>Хотелось бы увидеть эту гарантию в стандарте. Или её явное отсутствие. Я не нашёл в тексте стандарта, как и для Java HashMap.
У std::sort это неочевидно, но это естественным образом вытекает из требования о логлинейной сложности в худшем случае.
Потому что если рандомизация случайно приведёт к вырождению квиксорта в квадратную сложность, то мы должны будем в процессе переключиться на более медленный логлинейный алгоритм (например, на хипсорт).
А зачем тогда рандомизировать, если мы всё равно переключимся?