Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] UUID + AUTO_INCREMENT
Forum PHP.pl > Forum > Przedszkole
SmokAnalog
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?
SmokAnalog
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.
Pyton_000
To może to: http://php.net/manual/en/function.uniqid.php#120123
markuz
https://github.com/ramsey/uuid
sabat24
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.
SmokAnalog
@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.
sabat24
Obstawiam, że używają tego marketingowo albo w znaczeniu hash = ciąg znaków alfanumerycznych. Ciężko stwierdzić.
SmokAnalog
Obstawiam to drugie, bo w potocznym języku faktycznie hashem nazywa się po prostu nieczytelny ciąg znaków.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.