Jak utworzyć identyfikator GUID w języku Python, który jest niezależny od platformy? Słyszałem, że istnieje metoda wykorzystująca ActivePython w systemie Windows, ale jest to Windows tylko dlatego, że używa COM. Czy istnieje metoda wykorzystująca zwykły Python?
python
uuid
guid
uniqueidentifier
Jonathon Watney
źródło
źródło
python -c 'import uuid; print(uuid.uuid4())'
Odpowiedzi:
Dokumenty:
Przykład (praca na 2 i 3):
źródło
shortuuid
moduł, który napisałem, ponieważ pozwala on generować krótsze, czytelne identyfikatory UUID: github.com/stochastic-technologies/shortuuiduuid4().hex
istr(uuid4())
?str(uuid4())
zwraca ciąg reprezentujący UUID z dołączonymi myślnikami, podczas gdyuuid4().hex
zwraca „UUID jako 32-znakowy ciąg szesnastkowy”Jeśli używasz języka Python w wersji 2.5 lub nowszej, moduł uuid jest już dołączony do standardowej dystrybucji języka Python.
Dawny:
źródło
Skopiowano z: https://docs.python.org/2/library/uuid.html (Ponieważ opublikowane linki nie były aktywne i ciągle się aktualizują)
źródło
Używam GUID jako losowych kluczy do operacji typu bazy danych.
Forma szesnastkowa z myślnikami i dodatkowymi znakami wydaje mi się niepotrzebnie długa. Ale podoba mi się również to, że ciągi reprezentujące liczby szesnastkowe są bardzo bezpieczne, ponieważ nie zawierają znaków, które mogą powodować problemy w niektórych sytuacjach, takich jak „+”, „=” itp.
Zamiast szesnastkowego używam ciągu base64 bezpiecznego dla adresu URL. Poniższe informacje nie są jednak zgodne z żadną specyfikacją UUID / GUID (poza wymaganą losowością).
źródło
random.getrandbits(128).to_bytes(16, 'little')
lub (dla losowości kryptograficznej)os.urandom(16)
i uzyskać pełne 128 bitów losowości (UUIDv4 używa 6-7 bitów w informacjach o wersji). Lub użyj tylko 15 bajtów (tracąc 1-2 bity losowe vs. UUIDv4) i unikaj potrzeby przycinania=
znaków, jednocześnie zmniejszając rozmiar zakodowanego do 20 bajtów (z 24, przycinanych do 22), ponieważ dowolna wielokrotność 3 bajtów koduje do#bytes / 3 * 4
base64 znaków bez wypełniania.return
instrukcji oczekującej obiektu podobnego do bajtów. Można to naprawić za pomocąreturn str(r_uuid).replace('=','')
.Jeśli musisz przekazać UUID dla klucza podstawowego dla swojego modelu lub unikalnego pola, poniższy kod zwraca obiekt UUID -
Jeśli musisz podać UUID jako parametr adresu URL, możesz to zrobić jak poniżej kodu -
Jeśli chcesz mieć wartość szesnastkową dla UUID, możesz wykonać poniższe -
źródło
Ta funkcja jest w pełni konfigurowalna i generuje unikalny identyfikator użytkownika na podstawie określonego formatu
np .: - [8, 4, 4, 4, 12], jest to wspomniany format i wygeneruje następujący identyfikator UUID
źródło
Odpowiedź 2019 (dla Windows):
Jeśli chcesz mieć stały identyfikator UUID, który jednoznacznie identyfikuje maszynę w systemie Windows, możesz użyć tej sztuczki: (Skopiowano z mojej odpowiedzi na https://stackoverflow.com/a/58416992/8874388 ).
Używa interfejsu API systemu Windows, aby uzyskać stały identyfikator UUID komputera, a następnie przetwarza ciąg znaków, aby upewnić się, że jest to prawidłowy identyfikator UUID, i na koniec zwraca obiekt Python ( https://docs.python.org/3/library/uuid.html ), co daje ci wygodę sposoby wykorzystania danych (takie jak 128-bitowa liczba całkowita, ciąg szesnastkowy itp.).
Powodzenia!
PS: Wywołanie podprocesu można prawdopodobnie zastąpić ctypami bezpośrednio wywołującymi jądro systemu Windows / biblioteki DLL. Ale do moich celów ta funkcja jest wszystkim, czego potrzebuję. Dokonuje silnej walidacji i daje prawidłowe wyniki.
źródło
Sprawdź ten post, bardzo mi pomógł. Krótko mówiąc, najlepszą opcją dla mnie było:
Ponieważ potrzebowałem tylko 4-6 losowych znaków zamiast obszernego GUID.
źródło