PHP unikalne pole identyfikacyjne w url - php

Mam dylemat. Potrzebuję unikalnego ciągu w mojej tabeli bazy danych, aby pokazać go w adresie URL (nie pokazuję id w adresie URL).

Chcę wygenerować w php unikatowy ciąg znaków, który jest unikalny w tabeli, jeśli nie zostanie wygenerowany nowy.

Co myślisz pod względem wydajności dla ciągu znaków o długości 8 znaków i dużej liczby wierszy (około 100 000 wierszy).

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz stworzyć unikalny identyfikator w php używając uniqid().

Podczas generowania nowego ID, sprawdź DB, aby sprawdzić, czy istnieje. Jeśli tak, utwórz nowy. Zakładając, że skonfigurowałeś indeks dla tej kolumny w bazie danych, te kontrole nie będą bardzo drogie.

W kodzie pseudo (-ish):

while (true) {
$id = uniqid();

if (!id_exists_in_db($id)) // we have a unique id
break;
}

1 dla odpowiedzi nr 2

Zamiast generować unikalny klucz opróczid, możesz także utworzyć funkcję, która miesza lub koduje id do łańcucha. Na przykład możesz przekonwertować liczbę całkowitą na 8-znakową reprezentację w postaci szesnastkowej. Możesz go nieco bardziej skomplikować, jeśli chcesz, ale mimo to całkiem łatwo jest napisać funkcję, która używa stałej formuły, aby przekonwertować liczbę na 8 liter i na odwrót. W ten sposób nie musisz przechowywać te dodatkowe dane i nie musisz się martwić, że wartość jest wyjątkowa.

<?php

function translate($key, $back)
{
$key = str_pad($key, 8, "0", STR_PAD_LEFT);
$a = array("1","2","3","4","5","6","7","8","9","0");
$b = array("a","b","c","d","e","f","g","h","i","j");
if ($back) {$c = $b; $b = $a; $a = $c;}
return str_replace($a, $b, $key);
}

function encode_id($int)
{
return translate($int, false);
}

function decode_id($key)
{
return (int)translate($key, true);
}

$key = encode_id(40000);
$int = decode_id($key);
echo $key;
echo "<br>";
echo $int;

Menu