Что делать – Telegram
Что делать
100 subscribers
209 photos
3 videos
4 files
130 links
Не смешно
Download Telegram
Рост
Мапа растёт в двух случаях:
- Когда load factor пересекает предел в среднем 6.5 элементов на бакет;
- Когда количество overflow buckets становится примерно равным количеству main buckets;

При том во втором случае, происходит так званый same size growth. К сожалению, я так и не понял, как он работает, и почему он триггерится раньше, чем по load factor. Но в теории, он должен как-то переставлять вхождения, чтобы меньше overflow бакетов использовать.
👍1🤔1
Hasher
Хэш-функция поставляеся с maptype и принимает два аргумента: непосредственно сам ключ, и сид. И вот сид есть довольно интересная вещь, целью которой является предотвращение вектора атак на хэшфункцию, суть которой заключается в нахождении коллизий так, чтобы заставить хэшмапу работать неэффективно, облегчая тем самым DoS (или же DDoS как множественные одиночные попытки DoS). Сид берётся из генератора псевдослучайных чисел, и назначается в момент инициализации мапы.

С итерацией вообще всё интересно. Помимо того, что из-за разного сида одни и те же ключи будут давать разный хэш, и, соответственно, попадать в разные бакеты, добавляется ещё и элемент неожиданности в виде старта итерации с рандомного бакета. Ну, то есть, итератор-то обойдёт все бакеты с начала до конца по порядку, только начало его лежит в рандомном месте. Тобишь, где-то у нас будет "разлом": первое значение из не-пустого бакета будет идти после последнего. Зачем это надо - я даже представить не могу, если честно. Отсюда берётся разность последовательностей при итерировании одной и той же мапы несколько раз, умноженная на рандомизацию позиций вхождений из-за рандомного сида для каждой мапы (хоть и насколько я слышал, если одновременно две мапы инстанциировать, то и сид у них может быть одинаковый - но в этом я не сильно уверен).
А вот здесь - в mapiternext - они через побитовый И как раз закольцевали итерацию по бакетам. Фактически, это то же самое, что и если бы они (i + it.offset) % len(map) написали
Дополнительные источники:
Исходники (в комментариях довольно много интересной и полезной информации): https://github.com/golang/go/blob/master/src/runtime/map_noswiss.go

Основную информацию брал отсюда: https://victoriametrics.com/blog/go-map/#map-in-go-quick-start

Полезно для общего ознакомления, рассказывается о мапах в т.ч. плюсах и джаве: https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics

По новой SwissMap: https://themsaid.com/map-internals-go-1-24
👍1
Чёт как-то ну
Пиздить из го пока получается с переменным успехом
😁4
Что делать
Чёт как-то ну Пиздить из го пока получается с переменным успехом
Перемога! У меня оно так потому, что в подсчёте общего количества бакетов у меня прибавлялся log2 количества мейнбакетов вместо реального числа (т.е. 2^b)
Что делать
Чёт как-то ну Пиздить из го пока получается с переменным успехом
Вообще, я поступил умно. Вместо того, чтобы аллоцировать и инициализировать каждый бакет, я просто решил подшаманить так, чтобы tophash = 0 рассматривалось, как "этот, и все слоты справа - свободны", и аллоцирую массив с мейнбакетами через calloc - который как раз возвращает указатель на полностью зануленную память.

По всей видимости, оно-то могло гигабайты в секунду потреблять, да только занято занулением было. Ещё и на диске🥸
🔥1
А вот конечно подставы с асаном я не ожидал. Фокус в том, что один раз оно даже реально сработало и показало достойный репорт. Чувствую себя секретаршей.
Что делать
А вот конечно подставы с асаном я не ожидал. Фокус в том, что один раз оно даже реально сработало и показало достойный репорт. Чувствую себя секретаршей.
Хорошо, был виноват действительно meson. add_project_arguments("-fsanitize=address") честно не знаю, что делает, но до линкера флаг не доходит. Решением стало продублировать его в add_project_link_arguments()
Хэш-функция wyhash используется по-умолчанию в Зиге, Ниме и Го (начиная с 1.17), и считается одной из самых быстрых. И насколько же ржачная у автора почта)
🔥1
Что делать
Хэш-функция wyhash используется по-умолчанию в Зиге, Ниме и Го (начиная с 1.17), и считается одной из самых быстрых. И насколько же ржачная у автора почта)
На этом всё не кончается. Он просто взял и назвал презервативом🗿

При том, что он даже в описании упомянул слово protects!! Какой-то итальянец, который сделал rapidhash как эволюцию wyhash'a, тоже назвал это PROTECTED. НО КИТАЙЦУ ПОХУЙ, У КИТАЙЦА CONDOM
😁4
Чувак работает в Fudan University в Шанхае. Просто приходит, с Даниэлем Лемайром casually drops SotA хэшфункцию, даже лицензию никакую не ставит. И уходит.
😁3
Я ж сука уверен, у него есть красивенькая университетская почта. Но китайцу похуй. Китаец гоняет с godspeed_china@yeah.net.

Я им восхищаюсь.
😁4
Прекрасно. Я перепутал разделы и вхуярил образ никса в свой рут вместо флешки🗿

То-то ещё сука думаю, хули этот задохлик вдруг стал 70мб/с на запись выдавать блять
😁6🤯2🤡1
Что делать
Прекрасно. Я перепутал разделы и вхуярил образ никса в свой рут вместо флешки🗿 То-то ещё сука думаю, хули этот задохлик вдруг стал 70мб/с на запись выдавать блять
Просыпаюсь, пробуждаю эту шайтан-машину. Кеды по классике решили умереть, только теперь окончательно: даже в тту переключиться нельзя. Понимая, что чинить это можно только ребутом, а с некоторых пор я больше никогда не смогу обратно в систему бутнуться, с утрешнего нераздупля пришлось таки садиться и ставить этот никс.

Загружаюсь во флешку. Загружается, но зависает после сообщения о попытке поднять systemd-udevd. Посидев пару минут, начинаю осознавать, что мой образ битый, а старой системы больше-то и нет, чтобы залить чем-то другим.

Но вспоминаю, что, слава богу, у меня на втором м2 ссд ещё винда есть. Перезагружаюсь, тыкаю в биосе сначала на первый м2. Загружается установщик никса...

Пытаюсь ещё раз. Бутаюсь во второй м2 ссд в списке. Загружается установщик никса...

Вытаскиваю флешку, ребутаюсь. Загружается установщик никса...

Вот тут я конкретно охуел. Что бы я не делал, эта транзисторная рисоварка всё равно грузится в установщик никса. При том хорошо, если бы он ещё работал

А ответ, кстати, оказался довольно прост: вот как раз те 2.5 гига, которые я случайно на ссд заебашил, как раз и загружались. По крайней мере, хорошая новость - мне больше не нужна будет флешка
🤯2
Отдельно хочу поблагодарить разработчикам balenaEtcher. Эти ребята умудрились поломать код в дистрибуции для армов. Пришлось кочегарить розетту, потому что в арме оно ныло на (0, h.requestMeta) is not a function. х86 версия, кстати, сработала без нареканий по функционалу - гуй тормозной был, правда, ну просто жуть.