Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] UUID + AUTO_INCREMENT
SmokAnalog
post 17.01.2018, 15:18:37
Post #1





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Panowie,

czy jest jakiś wbudowany sposób w MySQL, żeby używać UUID z AUTO_INCREMENT? Czasami przydałoby mi się coś takiego. Podam przykład.

Powiedzmy, że zapragnąłem zrobić własny system captcha. Większość podobnych rozwiązań ma taką wadę, że nie działa, gdy mamy otwartych kilka kart z formularzem captcha, bo na serwerze zapisywana jest w jednym czasie tylko jedna poprawna odpowiedź na użytkownika. Otwierając kolejną kartę z captcha, te otwarte wcześniej pokazują już nieaktualny obrazek. Dlatego ja chcę w formularzu captcha przekazywać specjalny kod, który jest tworzony w bazie danych w momencie wyświetlania zadania captcha jako para: kod i rozwiązanie, na przykład 8kjprmbjxmw9tq2k (kod przekazywany do input hidden) i rozwiązanie "hakuna matata".

To zmyślony przykład, ale dość regularnie napotykam na problem, że chcę generować w bazie UUID. Czasami nawet nie musi to zastępować normalnego klucza, bo służy mi jako "widoczny klucz". Nie chcę, żeby użytkownicy mogli po zwykłym kluczu odczytać który to rekord z kolei, a jakoś muszę zidentyfikować rekord na przykład w formularzu. Zazwyczaj robię to tak, że losuję string w PHP i robię to w pętli tak długo, jak dany string istnieje. Nie ukrywam jednak, że rozwiązanie bazodanowe ułatwiłoby mi życie.

Można też wygenerować miliony losowych stringów i dopasowywać po ID (lub po prostu brać losowe i oznaczać zużyte), jednak średnio mi się podoba ten pomysł, bo znowu jest to jakaś dodatkowa logika.

Co robicie w sytuacjach, gdy potrzebujecie każdy rekord określić losowym i unikalnym ciągiem znaków?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Pyton_000
post 17.01.2018, 15:30:11
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


https://dev.mysql.com/doc/refman/5.7/en/mis...l#function_uuid
Go to the top of the page
+Quote Post
SmokAnalog
post 17.01.2018, 15:38:28
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Znam funkcję UUID(), ale jej nie lubię. Ona nie zwraca prawdziwie losowo-wyglądających stringów, bo większa część stringa się powtarza. Mógłbym niby wyciąć tę część przed pierwszym myślnikiem, ale to głupie, bo jest duża szansa wylosowania kolejny raz takiej samej części.
Go to the top of the page
+Quote Post
Pyton_000
post 17.01.2018, 15:47:52
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


To może to: http://php.net/manual/en/function.uniqid.php#120123
Go to the top of the page
+Quote Post
markuz
post 17.01.2018, 17:15:08
Post #5





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


https://github.com/ramsey/uuid


--------------------
Go to the top of the page
+Quote Post
sabat24
post 17.01.2018, 19:30:43
Post #6





Grupa: Zarejestrowani
Postów: 175
Pomógł: 26
Dołączył: 13.09.2007
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Do ukrycia prawdziwego ID z AUTO_INCREMENT, używam tego: https://github.com/ivanakimov/hashids.php - można nadać sobie sól i wtedy generujesz stosunkowo krótki, unikalny hash, który możesz z powrotem odkodować i mieć swoje ID z bazy. Dzięki temu nie trzeba trzymać ekstra kolumny z publicznym kodem, potencjalnie nie zmieniasz SELECTów i nie trzymasz dodatkowych indeksów na CHARach.

Ten post edytował sabat24 17.01.2018, 19:33:29
Go to the top of the page
+Quote Post
SmokAnalog
post 17.01.2018, 20:03:31
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@markuz Kiedyś natknąłem się na tę paczkę i faktycznie jest fajna do generowania UUID. Jednak samo generowanie UUID to w tym wszystkim najmniejszy problem.

@sabat24 Jeszcze zanim odpisałeś, myślałem właśnie o tym, że jeszcze lepiej byłoby nie zapisywać tego losowego ciągu znaków, tylko po prostu zakodować i zdekodować mój czysty ID. Zastanawia mnie jedno. Dlaczego oni nazywają to hashem, skoro to później odkodowują? Hash to raczej z definicji jest nie do odkodowania.
Go to the top of the page
+Quote Post
sabat24
post 17.01.2018, 20:10:56
Post #8





Grupa: Zarejestrowani
Postów: 175
Pomógł: 26
Dołączył: 13.09.2007
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Obstawiam, że używają tego marketingowo albo w znaczeniu hash = ciąg znaków alfanumerycznych. Ciężko stwierdzić.
Go to the top of the page
+Quote Post
SmokAnalog
post 17.01.2018, 20:14:59
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Obstawiam to drugie, bo w potocznym języku faktycznie hashem nazywa się po prostu nieczytelny ciąg znaków.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:17