Chciałbym użyć Youtube jako przykładu: używają identyfikatorów w postaci PEckzwggd78
.
Dlaczego nie używają prostych liczb całkowitych?
Lub imgur.com - używają również identyfikatorów, takich jak 9b6tMZS
zdjęcia i galerie. Nie sekwencyjne liczby całkowite.
Dlaczego nie używają liczb całkowitych (szczególnie sekwencyjnych)?
W jakich przypadkach rozsądną decyzją jest stosowanie takich identyfikatorów ciągów zamiast liczb całkowitych?
Odpowiedzi:
YouTube nie może używać sekwencyjnych identyfikatorów z dwóch powodów:
Jego bazy danych są prawie na pewno rozproszone, co komplikuje numerowanie sekwencyjne.
Ma opcję prywatności „Filmy niepubliczne”: te, które nie pojawiają się w wynikach wyszukiwania, ale są dostępne, jeśli znasz identyfikator.
Dlatego identyfikatory wideo powinny być w miarę losowe i nieprzewidywalne. To, czy identyfikator jest reprezentowany tylko przez cyfry, czy przez kombinację liter i cyfr, nie ma znaczenia: istnieje trywialne mapowanie z jednej reprezentacji na drugą.
źródło
2^40
przedmioty, w niektórych architekturach istnieją uzasadnione powody, aby wybrać przestrzeń2^80
lub2^120
bity. Przykłady przyczyn: ograniczenie kolizji bez technicznego sprawdzania kolizji; wykorzystanie rzadkości kluczy w ramach utrudniania odnalezienia tajemnic („wideo niepubliczne”) itp.W postaci identyfikatorów: Oni używają Base64 (za pomocą znaków
a
-z
,A
-Z
,0
-9
,-
, i_
). To pozwala im mieć 6 bitów informacji na znak. YouTube używa 11-znakowych identyfikatorów wideo, co oznacza, że mogą wygenerować 2 6 * 11 lub więcej niż 7 * 10 19 identyfikatorów. Jak to ujął Tom Scott , „wystarczy, aby każdy człowiek na Ziemi mógł przesyłać filmy co minutę przez około 18 000 lat”. Base64 jest również łatwy w obsłudze, ponieważ 64 to potęga 2, co oznacza, że każdy znak reprezentuje dokładną liczbę bitów. Używamy systemu szesnastkowego (podstawa 16) z tego samego powodu.Ze względu na niesekwencyjny charakter identyfikatorów: oznacza to, że nie potrzebują zsynchronizowanego licznika między wszystkimi serwerami, które przypisują identyfikatory do filmów. Mogą po prostu wygenerować losową liczbę, sprawdzić, czy jest już w użyciu, i przejść od tego momentu. Mogą nawet przypisać każdemu serwerowi blok identyfikatorów do wyboru i wyeliminować sprawdzanie duplikacji. Nie wiem, czy oni to robią, ale mogli.
Innym powodem niesekwencyjnych identyfikatorów jest to, że właśnie dzięki temu działają filmy „niepubliczne”. Są to filmy, które nie pojawią się w wynikach wyszukiwania lub jako sugestie, ale są dostępne, jeśli masz link. Jeśli korzystasz z liczenia sekwencyjnego, możesz po prostu przejść do filmu, zwiększyć identyfikator o jeden, a pomysł niepublicznych filmów wideo jest teraz zepsuty.
Identyfikatory niesekwencyjne pomagają również ukryć informacje przed konkurentami, takie jak łączna liczba filmów lub liczba filmów przesłanych w określonym przedziale czasowym.
Mogę bardzo polecić wideo Toma Scotta . Jego informacje są prawie zawsze zarówno interesujące, jak i dokładne.
źródło
Liczby całkowite nie skalują się tak dobrze, „normalna” 32-bitowa liczba całkowita bez znaku może przekroczyć nieco ponad 4 miliardy.
Mogą nie chcieć, abyś wiedział, ile przedmiotów ma w Internecie, lub śledził tempo wzrostu.
Litery mogą zawierać więcej informacji niż cyfry, potrzebujesz mniej liter, aby wyrazić ten sam „numer”. W przypadku dużej bazy danych indeksatora może to być suma.
źródło
1) Dlaczego niektóre strony internetowe używają liter w swoich identyfikatorach? Czy to są sznurki?
Nie wiemy, czy strony te przechowują identyfikatory w swojej bazie danych jako ciągi znaków. Liczby i ciągi znaków są w rzeczywistości takie same dla komputerów. Łańcuch to tylko liczba, pokazana na innej podstawie.
'A' = 0x41 = 65 = 0b1000001
, dla komputera wszystko jest takie samo. Ale jeśli go wyświetlisz, im większa baza, tym krótsza reprezentacja i krótsze adresy URL są łatwiejsze do odczytania i udostępnienia dla ludzi. Strony takie jak YouTube i Imgur używają bazy 62 (litery, wielkie i małe litery oraz cyfry) lub większej (dodaj myślnik lub inne prawidłowe znaki adresu URL), co jest względnie krótkie dla dużych liczb. Z czego wolisz korzystaćyoutu.be/23489234892348234933
lubyoutu.be/B9k6KMrv8vh
?2) Dlaczego używane są niesekwencyjne identyfikatory?
Odpowiedź IMil dobrze to wyjaśnia:
Wyjaśniają one również, dlaczego identyfikatory są tak duże: (oczywiście YouTube nie obsługuje 23 489 234 892 348 234 933 różnych filmów)
Podczas generowania identyfikatorów problemem jest przypadkowe dwukrotne wygenerowanie tego samego identyfikatora, dlatego potrzebujesz dużej przestrzeni na identyfikatory, aby zapobiec problemowi z urodzinami
Ludzie mogą po prostu odgadnąć adres URL niepublicznych filmów, jeśli szansa na użycie dowolnego ważnego identyfikatora w filmie nie jest bardzo, bardzo mała.
źródło
People can just guess the URL of unlisted videos if the chance of any given valid ID being used for a video isn't very, very small.
- skąd wiesz, że film niepubliczny nie jest dostępny dla wszystkich oprócz jego autora? nawet jeśli ktoś odgadł jego identyfikatorNawiasem mówiąc, niekoniecznie jest tak, że wewnętrzna reprezentacja jest łańcuchem. Prawdopodobnie mogą kodować identyfikator numeryczny jako ciąg alfanumeryczny dla krótszego adresu URL.
źródło
Jak już wskazał, że byłoby to łatwe w użyciu powszechnie unikalny identyfikator tylko przy użyciu numerów, bo pod maską wszystko jest po prostu
0
i1
i można zwiększyć liczbę do bardziej precyzyjnego podchodząc do 128 bitów lub więcej.Myślę, że głównym powodem jest to, że zakładając dowolny ustalony zakres, taki jak
uint32
(na przykład), jeśli używasz również liter, możesz mieć w sumie krótszy identyfikator.Wyobrażam sobie, że jest to uzasadnienie estetyczne adresu URL. Zamiast mieć
4,129,873,773
litery, jest znacznie krótszyFu837t
(po prostu fikcyjny wymyślony przeze mnie). Użytkownik może nawet zapamiętać adres URL w celu przekazania go znajomemu. Platformy takie jak Youtube zwykle mają dłuższe UUID niż 32 bity, ponieważ szybko zabraknie im miejsca.źródło
Krótki URL jest pożądany, ponieważ upraszcza łączenie i udostępnianie (np. Możesz udostępnić link w SMS-ie, szybciej jest pisać i tak dalej). Usługi takie jak Youtube lub Imgurl chcą, aby adresy URL były udostępniane swobodnie, więc jest to ważna kwestia.
Używanie alfanumerycznych identyfikatorów zamiast liczb oznacza, że potrzebujesz mniej znaków, aby wyrazić identyfikator o tym samym rozmiarze bitowym. Na przykład 6 cyfr daje milion unikalnych identyfikatorów, ale 6 znaków alfanumerycznych (przy użyciu zestawu base64) daje 68 miliardów unikalnych identyfikatorów.
Z tego co wiemy, alfanumerycznymi identyfikatorami mogą być kolejne numery, po prostu zakodowane w formacie alfanumerycznym, takim jak base64. Jednak często usługi komercyjne unikają kodów sekwencyjnych, aby ludzie nie zgadywali identyfikatorów i nie ujawniali informacji biznesowych, takich jak liczba klientów.
źródło
Istnieje kilka powodów, dla których warto używać identyfikatorów nienumerycznych, ale rozumiemy również, że nie wszystkie wartości ze znakami alfabetycznymi są tak naprawdę łańcuchami. YouTube ma reputację niewiarygodnej liczby filmów, rzędu 300 godzin filmów przesyłanych co minutę ( ref ). Unikalne liczby całkowite reprezentujące te filmy mogą być dość długie, więc użyj czegoś takiego jak liczby zakodowane w formacie Base64 URL ( ref ).
Rodzaje reprezentacji identyfikatorów:
Wszystkie mają swoje mocne i słabe strony. Im więcej unikatowych znaków możesz użyć do identyfikatorów, tym mniej znaków potrzebujesz do reprezentowania liczby. Podstawowe liczby 64 są dość dobrym kompromisem, ponieważ istnieje ustalony wariant, który działa dla adresów URL i kompresuje liczbę znaków potrzebnych do przedstawienia liczby od 6 do 8 (tj. 3/4 rozmiaru).
Czytelne ciągi działają w przypadku blogów, ponieważ mogą zwiększyć możliwości wyszukiwania, a znacznie łatwiej jest generować unikalne tytuły, gdy liczba rekordów jest niewielka.
źródło
Mieszanie treści
Słowa „hash” nie ma w istniejących, fajnych odpowiedziach, więc zaczynamy:
Często dane można rozpoznać po wartości mieszania zamiast niezależnego, sztucznego identyfikatora. Jest to szczególnie widoczne w oprogramowaniu
git
lub systemach plików, takich jak ZFS, w których ta szczególna właściwość używania skrótów zawartości nie tylko ułatwia rzeczy (na przykład usuwanie duplikatów), ale ma także inne miłe właściwości, takie jak trywialne buforowanie, bezpieczna historia, wykrywanie zgnilizny bitów itp.Hashe zwykle występują jako liczby szesnastkowe (lub nawet większa przestrzeń na litery), dlatego nie widzisz liczb całkowitych. Po prostu to nie ma liczb całkowitych (w tych przypadkach).
Hashe są dobre, jeśli obiekty danych są niezmienne (jak w ZFS lub
git
); świetnie nadają się do przechowywania obrazów, na przykład na dużych sieciach CDN. Nie wiem, czy te konkretne identyfikatory faktycznie są skrótami, ale z pewnością miałoby to sens (i jak skomentował Michael Kjörling, krótkie identyfikatory prawdopodobnie nie są skrótami z oczywistych powodów - dla porównania, git używa wartości SHA-1, które są 20 bajtami lub 40 cyfry szesnastkowe).źródło
hashCode()
itp. Oczywiście im krótszy hash, tym bardziej prawdopodobne są losowe kolizje.Ok jednym z powodów jest to, że znaki są wysyłane jako znaki, a nie jako liczby całkowite. Wynika to z działania HTTP Get.
Kiedy mówisz: „dlaczego nie użyć liczby całkowitej?” Cóż, liczba całkowita jest następnie dzielona na części, a każda cyfra jest wysyłana jako znak, a ty i tak otrzymujesz ciąg znaków. Dlaczego więc nie wykorzystać wszystkich opcji dla postaci?
Istnieje również czynnik ludzki:
Weźmy na przykład imgur: https://imgur.com/ ***** / s6UqP
s6UqP,
Zakres każdego znaku wynosi: od a do z kapitału, od a do z pod kapitału i od 0 do 9 = 26+ 26+ 10 = 62 opcje dla każdej pozycji w ciągu. Z pięcioma pozycjami, czyli 916132832 możliwych kombinacji. Jeśli użyjesz tylko cyfr, potrzebujesz 9 cyfr.
Ludzie mogą przechowywać w pamięci około 7 obiektów, 9 cyfr to za dużo, wykonalnych jest 5 znaków.
Magiczna liczba 7
źródło