2009-08-19 9 views
6

Potrzebuję wygenerować unikalny identyfikator rekordu dla danego unikalnego ciągu.Skrócenie uuid dalej, aby krótki ciąg

Próbowałem używać formatu uuid, który wydaje się być dobry.

Ale uważamy, że to jest długotrwałe.

, więc musimy wyciąć uuid ciąg 9f218a38-12cd-5942-b877-80adc0589315 na mniejsze. Usuwając "-" możemy zapisać 4 znaki. Jaka jest najbezpieczniejsza część do usunięcia z uuid? Nie potrzebujemy uniwersalnego identyfikatora, ale lubimy używać uuid jako źródła, ale wycinamy łańcuchy.

Potrzebujemy unikalnego identyfikatora specyficznego dla witryny/bazy danych (usługi SQL Server/ADO.NET Data).

Każdy pomysł lub próbki z każdego języka jest w porządku

Dzięki z góry

Odpowiedz

3

Jeśli używasz MS-SQL należy prawdopodobnie wystarczy użyć typu danych uniqueindentifier, to zarówno kompaktowe (16 bajtów), a ponieważ silnik SQL wie o tym może zoptymalizować indeksów i zapytań go używać.

+1

Identyfikator UUID ma również 16 bajtów, więc wcale nie jest mniejszy. –

+0

Glenn, uniqueindentifier == UUID, ale OP zdecydowanie mówił o przechowywaniu go jako ciąg. –

0

UUID ma 128 bitów. Czy rozważałeś zrobienie CRC tego? To może łatwo uzyskać 16 lub 32 bity i wykorzystywać wszystkie oryginalne informacje. Jeśli CRC nie jest wystarczająco dobry, zawsze możesz użyć pierwszych kilku bajtów odpowiedniego skrótu (na przykład SHA256).

Jeśli naprawdę chcesz po prostu wyciąć UUID, jego format jest opisany w RFC 4122. Powinieneś być w stanie dowiedzieć się, jakie części nie wymaga tego twoja implementacja.

+1

CRC nie byłby wcale unikalny. –

+1

Zależy od tego, ile wyjątkowości potrzebuje. Dlatego zaproponowałem zarówno CRC, jak i alternatywę. –

+1

Niestety, nie można wyciąć nieprzetworzonych bitów UUID, nie tracąc statusu jako UUID. Wynika to z tego, że musi istnieć 128 bitów losowości, aby można było uznać je za UUID i wystarczająco ograniczyć możliwość kolizji do poziomu bliskiego zeru. –

2

UUID zapewnia (prawie) 128 bitów unikalności. Możesz skrócić go do 16 bajtów binarnych lub 22 znaków zakodowanych na podstawie base64. Nie polecałbym usuwania żadnej części UUID, w przeciwnym razie po prostu traci sens. Identyfikatory UUID zostały zaprojektowane tak, aby wszystkie 128 bitów miały znaczenie. Jeśli chcesz mniej, powinieneś użyć innego schematu.

Na przykład, jeśli możesz zagwarantować, że tylko UUID w wersji 4 są używane, możesz wziąć tylko pierwsze 32 bity lub tylko ostatnie 32 bity. Tracisz wyjątkowość, ale masz całkiem przypadkowe liczby. Po prostu unikaj bitów, które są naprawione (wersja i wariant).

Ale jeśli nie możesz tego zagwarantować, będziesz miał prawdziwe problemy. W przypadku UUID w wersji 1 pierwsze bity nie będą unikalne dla identyfikatorów UUID wygenerowanych w tym samym dniu, a ostatnie bity nie będą unikalne dla identyfikatorów UUID wygenerowanych w tym samym systemie. Nawet jeśli CRC to UUID, nie ma gwarancji, że będziesz miał 16 lub 32 bity wyjątkowości.

W takim przypadku wystarczy użyć innego schematu. Wygeneruj 32-bitową liczbę losową za pomocą systemowego generatora liczb losowych i użyj go jako unikalnego identyfikatora. Nie polegaj na identyfikatorach UUID, jeśli zamierzasz rozebrać jego długość.

2

UUID ma 128 bitów lub 16 bajtów. Bez kodowania można uzyskać tylko 16 bajtów. Identyfikatory UUID są zwykle pisane w systemie szesnastkowym, co czyni je 32-bajtowymi łańcuchami.Z innych kodowań, można uzyskać różne wyniki:

  1. base-64 zamienia 3 8-bitowych bajtów na 4 6-bitowych znaków, więc 16 bajtów danych staje się 22 znaków
  2. base-85 zamienia 4 8- bitów na 5 znaków 6.4-bitowych, tak więc 16 bajtów danych ma długość 20 znaków

Wszystko zależy od tego, czy chcesz mieć czytelne napisy i jak standardowe/wspólne kodowanie chcesz użyć.