Wpis z mikrobloga

#programowanie #cpp
http://www.cplusplus.com/reference/unordered_map/unordered_map/

Hash

A unary function object type that takes an object of type key type as argument and returns a unique value of type sizet based on it. This can either be a class implementing a function call operator or a pointer to a function (see constructor for an example). This defaults to hash, which returns a hash value with a probability of collision approaching 1.0/std::numericlimits::max().

Co to znaczy, jakiej kolizji, dlaczego i kiedy mam się tym przejmować?
  • 12
  • Odpowiedz
@Capt_S: mapa #!$%@?ąca działa tak, że ma pod spodem tablicę elementów, i jak potrzebujesz wstawić pod indeks "ALA MA KOTA" wartość "Lorem Ipsum" to liczy hasza dla tego klucza "ALA MA KOTA" - wychodzi np 997, i wstawia pod indeks 997.

Potem chcesz wstawić pod indeks "JP2GMD" wartość "Serio Serio" - więc liczysz hasza dla "JP2GMD" - wychodzi np 1234 - wstawiasz pod ten indeks "Serio Serio".

Kolizja jest wtedy, jak
  • Odpowiedz
@tell_me_more: ah, bo ja tu za @MamCieNaHita już chciałem tworzyć vector z wartościami i się do niego odnosić, ale jeżeli mówisz, że to działa tak czy siak, a po prostu jest wolniejsze to sobie to daruję. Bałem się wyjątków. Dzięki. :)
  • Odpowiedz
generalnie to po prostu mam funkcję która zapisuje błąd do pliku, ale ze względu na asynchroniczną naturę mojego kodu, dodałem oczekiwanie na podstawie statycznego boola... ale plików jest kilka, a funkcja jedna więc chcę wiedzieć jaki to plik żeby nie czekać aż zwolnią się wszystkie.
  • Odpowiedz
@tell_me_more: mam na dysku pliki z których korzystają różne funkcje. Piszę funkcję "otwórz plik(fileName)" i jeżeli ten plik jest zajęty to czekam aż zostanie zamknięty:

static bool GUARDED = false;

co_await resume_background();

if (GUARDED)
{
std::this_thread::sleep_for(1s);
co_return co_await WaitAndOpenRoamingFileAsync(fileName);
}
else
{
GUARDED = true;
StorageFolder folder{ ApplicationData::Current().RoamingFolder() };
try
{
co_return co_await folder.CreateFileAsync(fileName, CreationCollisionOption::OpenIfExists);
}
catch (hresult_error const& ex)
{
co_return StorageFile(nullptr);
}
GUARDED = false;
co_return StorageFile(nullptr);
}

No
  • Odpowiedz
@Capt_S: możesz zrobić haszmapę i takie rozwiązanie, ale możesz w ten sposób zrobić deadlocka, jak w jednym kawałku kodu masz:

otwórz plikA
otwórz plikB
zapisz plikA
zapisz plikB

a w innym masz

otwórz plikB
otwórz plikA
zapisz plikB
zapisz plikA

i akurat jeden wątek otworzy A a drugi B i będą na siebie czekać nawzajem w swoich drugich linijkach.
  • Odpowiedz
@tell_me_more: oj... czyli zwolnienie blokady dać jako osobną funkcję, przy zamykaniu pliku? Da się to jakoś zrobić, że będzie zwalniać automatycznie przy wyjściu jakiegoś pointera ze scope czy coś takiego?
  • Odpowiedz