Size: a a a

Rust — русскоговорящее сообщество

2021 June 15

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
хэш для интов это id
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
реаллокаций нет
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
это буквально посмотреть на каждый 1 раз и засунуть в нужный бакет
источник

П

Пух in Rust — русскоговорящее сообщество
А бакеты?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
предполагается что ты сразу сделал хэшсет нужного размера
источник

KB

Kirill Bulatov in Rust — русскоговорящее сообщество
О, опять.
А какие бакеты в растовом хешсете?
источник

r

red75prime in Rust — русскоговорящее сообщество
Это с хешером из FxHashSet. С id хэшером (hashers::null::PassThroughHasher), почему-то намного хуже.

Код функций
fn sort_dedup<T: Ord + Eq>(vs: &mut Vec<T>) {
   vs.sort_unstable();
   vs.dedup();
}

fn hashmap_dedup<T: std::hash::Hash + Eq>(vs: &mut Vec<T>) {
   let set: FxHashSet<_> = vs.drain(..).collect();
   vs.extend(set.into_iter());
}
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
fn sort_dedup<T: Ord + Eq>(vs: mut Vec<T>) -> impl Iterator {
   vs.sort_unstable();
   vs.dedup();
   vs
}

fn hashmap_dedup<T: std::hash::Hash + Eq>(vs: &[T]) -> impl Iterator {
   let set = HashSet::with_capacity(vs.len());
   set.extend(vs);
   set
}

я
думал скорее что-то такое
источник

П

Пух in Rust — русскоговорящее сообщество
``` /// Non-generic part of RawTable which allows functions to be instantiated only once regardless
/// of how many different key-value types are used.
struct RawTableInner<A> {
   // Mask to get an index from a hash value. The value is one less than the
   // number of buckets in the table.
   bucket_mask: usize,

   // [Padding], T1, T2, ..., Tlast, C1, C2, ...
   //                                ^ points here
   ctrl: NonNull<u8>,

   // Number of elements that can be inserted before we need to grow the table
   growth_left: usize,

   // Number of elements in the table, only really used by len()
   items: usize,

   alloc: A,
} ```

Ну какие-то видать есть
источник

П

Пух in Rust — русскоговорящее сообщество
А как
источник

KB

Kirill Bulatov in Rust — русскоговорящее сообщество
Ну я просто не понимаю терминологию (и алгоритмы, видимо), пытаюсь разобраться.

Для меня бакет в хеш таблице — элемент у array, куда мы сваливаемся, вычисляя оффсет от хеша элемента хеш таблицы.
В этом бакете — LinkedList/BinaryTree с элементами, для которых сие смещение одинаково.

А в Расте же swiss table, просто длиннющий массив, в котором пары ключ-значение и никаких листов/деревьев нет: для поиска элементов вычисляется range по хешу, а не один оффсет.
источник

П

Пух in Rust — русскоговорящее сообщество
Тогда там не надо дофига памяти сразу аллокнуть?
источник

KB

Kirill Bulatov in Rust — русскоговорящее сообщество
С виду, наоборот, всего один кусок непрерывно в памяти держать, а не кучу ссылок на ноды и врапперы, как в линкедлистах всяких.
источник

П

Пух in Rust — русскоговорящее сообщество
Как вставить в середину?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
по идее там сквозная адресация: вычислили хэш а потом имщем ближайший свободный от него
источник

П

Пух in Rust — русскоговорящее сообщество
И при реаллоке что делать?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
то же что и всегда - то же самое что при вставке)
источник

KB

Kirill Bulatov in Rust — русскоговорящее сообщество
shift элементов массива же
источник

П

Пух in Rust — русскоговорящее сообщество
Жестоко. Сет на чтение быстрый, а на запись не оч?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
я может чего-то не знаю про хэшсеты растовыЕ, но по идее там не так уж все дорого. У сэта нет никакой "середины"
источник