Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby - Hashe pod maską

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

Ruby - Hashe pod maską

18.11.2015 at Łódź Ruby user Group

Avatar for CucumisSativus

CucumisSativus

November 18, 2015

More Decks by CucumisSativus

Other Decks in Programming

Transcript

  1. Jak trzymane są dane w hashu? 0 1 7 8

    4 6 5 3 2 9 10 1 => 'el1' '2' => 'el2' :trzy => 1 struct st_table { /* troche niewaznych rzeczy */ int num_bins; // 11 int num_entries; // 3 struct st_table_entry **bins; };
  2. Odczytywanie danych z hasha 0 1 7 8 4 6

    5 3 2 9 10 1 => 'el1' '2' => 'el2' :trzy => 1 hash[1] funkcja_hashujaca(1) % 11 => 1 hash[:trzy] funkcja_hashujaca(:trzy) % 11 => ?
  3. Dodawanie danych do hasha 0 1 7 8 4 6

    5 3 2 9 10 1 => 'el1' '2' => 'el2' :trzy => 1 :cztery => 4 hash[:cztery] = 4 funkcja_hashujaca(4) % 11 => 8
  4. Funkcja hashująca krótko irb #1 1.hash => 3709253595230655525 '2'.hash =>

    1262910778843821320 :trzy.hash => -1450000291807366770 irb #2 1.hash => -3056501098034584631 '2'.hash => -3487312348025589315 :trzy.hash => -1489272169862565918
  5. Kolizje :nowy => 6 ? funkcja_hashujaca(1) % 11 => 1

    funkcja_hashujaca(:nowy) % 11 => 1 0 1 7 8 4 6 5 3 2 9 10 1 => 'el1' '2' => 'el2' :trzy => 1 :cztery => 4
  6. 0 1 7 8 4 6 5 3 2 9

    10 1 => 'el1' '2' => 'el2' :trzy => 1 :cztery => 4 :nowy => 6 hash[:nowy] funkcja_hashujaca(:nowy) % 11 => 1 :nowy.eql? 1 => false :nowy.eql? :nowy => true
  7. Pat Shaughnessy - Ruby Under a Microscope: An Illustrated Guide

    to Ruby Internals Co najmniej 3 porównania przy każdym odwołaniu Tylko 44 elementy!
  8. Rehash • density = num_entries / num_bins • jeżeli większe

    bądź równe 5 (ST_DEFAULT_MAX_DENSITY) • zwiększ liczbę binów do 19 (magiczny numer!) • dla każdego elementu odpal • funkcja_hashujaca(klucz) % 19
  9. Krótkie podsumowanie jeszcze przed końcem • Struktura klucz/wartość • Dane

    są trzymane w „koszyczkach” • wrzucane są do odpowiednich koszyczków zależnie od funkcj hashującej • Kiedy robi się ich za dużo następuje rehash
  10. Rehash i magiczne numerki ruby < 2.2 liczby pierwsze -

    2^n+a Tabela Peter Moore Maksymalna liczba binów według tej tablicy 1 073 741 909
  11. Funkcja hashująca tl;dr • Oparta na algorytmie MurmurHash • funkcja

    bazuje na przesunięciach bitowych • przy każdym odpaleniu ruby jest seedowana innymi danymi • funkcja bierze pod uwagę miejsce w pamięci danego obiektu • używa dwóch magicznych liczb 24 i 0x5bd1e995