Próbuję wygenerować unikalne identyfikatory do użycia w aplikacji Google App Engine i chciałbym uzyskać opinię na temat możliwości podejścia, które zamierzam zastosować (pytania na końcu). Czytałem sporo pytań na ten temat, ale nie pamiętam, jakbym podszedł do tego konkretnego podejścia.maleńka losowo wyglądająca generacja ID
Chciałbym losowo wyglądające identyfikatory, np. Skróty MD5, ale chcę też, żeby były małe. Cztery do sześciu znaków, na wzór tinyurl, byłoby idealne. Identyfikatory będą dotyczyć treści generowanych przez użytkowników, w kontekście mojej aplikacji, takich jak pytania testowe, które ludzie będą pisać. Nie jest konieczne, aby identyfikatory były losowe (jest w porządku, jeśli wyglądają jak identyfikatory seryjne), ale podejście, które zamierzam użyć, nadaje się do tego, więc nie jest to problem.
Osoby znające mechanizm Google App Engine wiedzą, że zapisy do magazynu danych są szczególnie drogie i mogą skutkować przekroczeniem limitu czasu, jeśli jest ich zbyt wiele w tej samej grupie jednostek. Liczniki Sharded to podejście, które jest często stosowane w celu uniknięcia rywalizacji o zapis na pojedynczym globalnym liczniku i nieudanych transakcjach, które się z nim wiążą.
Wraz z otrzymywaniem krótkich identyfikatorów i unikaniem sporów o zapisy, staram się unikać urodzinowego paradoksu. Chciałbym przygotować się na możliwość pojawienia się milionów identyfikatorów, nawet jeśli trochę za mało.
Myślałem o użyciu sharded licznik wzdłuż następujących linii:
- Licznik jest sharded na użytkownikach, tak że nie jest odłamek dla każdego użytkownika. Każdy obiekt licznika ma swój własny licznik, który jest specyficzny dla danego użytkownika, który jest zwiększany, gdy nowy element jest tworzony przez tego użytkownika. Liczba jest zwiększana niezależnie od tego, czy element został pomyślnie utworzony.
- Podstawą identyfikatora jest skrót MD5 o następującym ciągu: "< adres e-mail użytkownika > | < najnowszej wartości licznika >".
- Wynikowy skrót MD5 jest następnie obcięty, początkowo do czterech znaków.
- Zostaje zachowana pojedyncza globalna wartość "length". Za każdym razem, gdy poprzednie kroki powodują duplikowanie klucza (jeden wyobraża sobie, że na początku będzie to dość szybko), wartość długości zostanie zwiększona o jeden. Skróty MD5 dla nowych identyfikatorów będą teraz obcięte na "długości" znaków, a nie czterech znaków.
- Nie chcę ujawniać adresu e-mail użytkownika, co sugeruje, że jakiś skrót jest dobrym sposobem.
moje pytania to: Czy mam rację sądząc, że będzie to w dużej mierze uniknąć rywalizacji zapisu wyniku duplikatów kluczy i tego zapisu rywalizacji na polu długości prawdopodobnie nie byłoby problemem, zwłaszcza przy dłuższych? Czy ktoś może opisać matematykę tutaj? Czy długość szybko wzrośnie do długości skrótu MD5, podważając wartość całego podejścia? Czy byłoby lepiej po prostu przejść z pełnym (dłuższym) hash MD5, aby zachować łatwiejsze utrzymanie? Czy jest coś, co przeoczyłem?
Dzięki za interesujące podejście. Zastanowię się nad tym i spróbuję lepiej to zrozumieć. Mam tylko jedno pytanie: ile to może spowodować kolizje (lub ponowne próby) w miarę wzrostu liczby kluczy. Staram się, aby kolizje były jak najbliżej zera. –
Zderza się tylko kolizje, gdy partycje się zapełnią. – Dave
Dostępne są inne opcje optymalizacji: 1. Memcache lista "wypełnionych partycji" 2. Jeśli masz zamiar pobrać kilka identyfikatorów naraz, możesz pobrać blok partycji, a następnie zwiększ jej licznik o tę wartość. – Dave