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