![]() |
![]() |
![]()
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? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
-------------------- |
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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ć.
|
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 12:17 |