Oczywiście działa, ale czy istnieją przypadki, w których dwa zestawy tych samych elementów powodują dodanie dwóch wpisów w Dict? Domyślam się, że mam ten warunek wcześniej i zmieniłem swój kod z frozenset(...)
na tuple(sorted(frozenset(...)))
. Czy ktoś, kto wie, jak Dict i zamrożone wdrożenie potwierdzić, czy jest to wymagane, czy nie?Czy używanie zestawu zamrożonego jako klucza Dict jest bezpieczne?
Odpowiedz
istnieją przypadki, w których dwa zestawy tych samych elementów zdarzają dodać dwa wpisy w Dict?
Nr frozenset
hashing algorithm nie zależy od kolejności elementów, tylko od samych elementów. Dwa FS'es z tych samych elementów są równe i mają równe mieszań, a tym samym zaspokojenie obu kryteriów „tożsamości dict”, innymi słowy, są one takie same klucz DICT:
>>> a = frozenset([1,1,1,1,2,3])
>>> b = frozenset([3,3,3,3,2,1])
>>> {a:1, b:2}
{frozenset([1, 2, 3]): 2}
Zgodnie z dokumentami Frozenset ma możliwość zaostrzenia, ponieważ jest niezmienny. Oznaczałoby to, że można go użyć jako klucza do dyktatu, ponieważ warunkiem wstępnym klucza jest to, że jest on nieosiągalny.
Typ frozenset jest niezmienna i hashable - jego zawartość nie może być zmieniona po jego utworzeniu; dlatego może być używany jako klucz słownika lub jako element innego zestawu.
I nadmiarowo, z Dictionary docs:
... klucze, które mogą być dowolne niezmienne type
do wyjaśnienia, zestaw (z definicji), zamrożone lub nie, nie zachowuje porządku. Są one przechowywane wewnętrznie, a porządek nie jest brany pod uwagę, a zduplikowane elementy są usuwane, dlatego dwa zestawy zbudowane w różnych zamówieniach byłyby odpowiednikami kluczy w słowniku - są takie same.
>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1])
True
i podobnie
>>> d = {}
>>> d[frozenset([1,1,2,3])] = 'hello'
>>> d[frozenset([1,2,3,3])]
'hello'
>>> d[frozenset([3,3,3,2,1,1,1])]
'hello'
>>> d[frozenset([2,1,3])]
'hello'
Ale pytanie brzmiało, czy Frozensets zbudowany w innej kolejności, ale z tymi samymi ostatecznymi wartościami, mają różne wartości mieszania. Odpowiedź brzmi: nie, nie mają różnych wartości skrótu. – tdelaney
Zakładam, że zostało to zrozumiane, ponieważ zestaw z definicji nie zachowuje porządku. – JohnZ
Użytkownik odpowiedział * tak *, co oznacza, że myślisz, że skróty mogą być różne, więc 'tuple (posortowane (frozenset (...))) jest konieczne. Nie jest to kwestia nietrwałości czy porządku, jest to kwestia wartości hash. – tdelaney
typu frozenset jest niezmienna i hashable - jego zawartość nie może być zmieniany po utworzeniu; dlatego może być używany jako klucz słownikowy lub jako element innego zestawu.
(podkreślenie moje)
- 1. Czy używanie makr w R jest bezpieczne?
- 2. delphi Używanie rekordów jako klucza w TDictionary
- 3. Używanie tablicy logicznej jako niestandardowego klucza słownika
- 4. Używanie stałego NSString jako klucza dla NSUserDefaults
- 5. Czy mogę użyć klucza ogólnego jako klucza?
- 6. Czy używanie Heroku Postgres jest bezpieczne przed atakami MITM?
- 7. Dict jako pole modelu
- 8. Przechowywanie hasła sudo jako zmiennej w skrypcie - czy jest bezpieczne?
- 9. Bezpieczne używanie SecureString dla formularza logowania
- 10. Czy użycie java.io.BufferedOutputStream jest bezpieczne?
- 11. Jak używać zestawu elementów jako klucza w mapach Java?
- 12. Używanie JsonArray vs ArrayList jako zestawu danych do adaptera RecyclerView
- 13. Czy procesor wieloprocesowy.Manager(). Dict(). Setdefault() jest uszkodzony?
- 14. Używanie klucza w kolekcjach.defaultdict
- 15. Czy korzystanie z gcroot jest bezpieczne?
- 16. Używanie SHA1 jako skrótu wiadomości podczas generowania klucza cbc aes256
- 17. Używanie std :: string jako klucza do std :: map
- 18. Czy to korzystanie z varargs jest bezpieczne?
- 19. Używanie obiektu typu string jako klucza mieszania w Common Lisp
- 20. Używanie std :: reference_wrapper jako klucza w std :: map
- 21. Użyj bajtu [] jako klucza w słowniku
- 22. Używanie char * jako klucza w std :: map, jak to działa
- 23. Używanie dwóch kluczy obcych jako klucza podstawowego - MySQL
- 24. Czy bezpieczne jest włanie FragmentTransaction wewnątrz onActivityResult()?
- 25. Używanie elementu jako klucza do skrótu w języku JavaScript
- 26. Jak bezpieczne jest używanie wyłącznie redis do implementacji strumieni aktywności?
- 27. Używanie Dict Python dla instrukcji SQL INSERT
- 28. C#: Czy to przypisanie pola jest bezpieczne?
- 29. Czy to szyfrowanie AES jest wystarczająco bezpieczne?
- 30. Czy to (volatile bool) zawsze jest bezpieczne?
To co to przeznaczona. Jeśli masz przykład powodujący problemy, opublikuj go. – interjay