Re[6]: Java Interop - один и тот же код возвращает разные значения
От: Кодт Россия  
Дата: 19.03.25 22:17
Оценка:
Здравствуйте, 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 это неочевидно, но это естественным образом вытекает из требования о логлинейной сложности в худшем случае.
Потому что если рандомизация случайно приведёт к вырождению квиксорта в квадратную сложность, то мы должны будем в процессе переключиться на более медленный логлинейный алгоритм (например, на хипсорт).
А зачем тогда рандомизировать, если мы всё равно переключимся?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.