Unikalne identyfikatory w kanałach Atom

Unikalny, niezmienny identyfikator jest konieczny, aby rozpoznać twój kanał i jego wpisy pośród innych. Nawet, jeśli zmienisz tytuł kanału, przeniesiesz jego plik albo użytkownik pobierze go z innego źródła, to zawsze jego czytnik będzie mogł rozpoznać, że to ten sam kanał.

Podobnie jest z wpisami — identyfikator jest potrzebny do ich aktualizacji i odrzucania duplikatów.

Jeśli kanał nie będzie miał unikalnego identyfikatora, czytniki mogą go zignorować. Jeśli różne wpisy dostaną taki sam identyfikator to ich treść zostanie zgubiona. Jeśli wpisy będą dostawały przypadkowe identyfikatory to każda aktualizacja będzie dublowała wszystkie wpisy czyniąc kanał bezużytecznym w czytnikach agregujących (np. Thunderbird, Opera).

Jak zagwarantować unikalny identyfikator?

Ważne jest, żeby nikt nigdy przypadkiem nie użył takiego samego identyfikatora, jak ty.

URL

Dlatego identyfikatory mogą być adresami internetowymi. Adres nie musi wskazywać na istniejący plik. Może być zupełnie zmyślony, oby tylko był pod twoją kontrolą, czyli np. używał domeny należącej do ciebie.

Identyfikator dla kanału może być po prostu adresem (URI) twojego kanału, ale jeśli przeniesiesz kanał pod inny adres, nie zmieniaj identyfikatora — niech nadal wskazuje w to samo miejsce, co zawsze.

  <id>http://moja-domena.pl/kanaly/atom/2006/moj-pierwszy-kanal</id>

Dla wpisów możesz użyć identyfikatora kanału z dodanym np. ID z bazy danych albo datą opublikowania wpisu (również musisz uważać, żeby aktualizacja wpisu nie zmieniała jego identyfikatora).

  <id>http://moja-domena.pl/kanaly/atom/2006/moj-pierwszy-kanal/wpis/314</id>

UUID

Odpowiedni identyfikator potrafi wygenerować serwer MySQL za pomocą funkcji uuid(), np. kwerendą SELECT UUID().

Innym sposobem jest wygenerowanie zupełnie losowych identyfikatorów i przechowywanie ich razem z kanałem i jego wpisami. Jeśli wylosowany identyfikator będzie odpowiednio dużą liczbą (czyli bylejaki rand() nie wystarczy), to w praktyce nie zdarzy się kolizja z innym.

UUID zapisuje się w formacie:

  urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Gdzie x to cyfry szesnastkowe (0-9, a-f), np.

  <id>urn:uuid:f439e29a-16a6-1029-85eb-f6d54af2e08a</id>

Generowanie UUID za pomocą PHP:

       /**
        * UUID
        *           
        * Generuje UUID z danego ciagu znakow...
        *
        * @access    public
        * @param string $string ciag znakow potrzebny   
        * @return    mixed
        */
       function uuid($string) 
       {
            // Pobiera $string, i tworzy ,,hash,,
            $base = strtolower(md5(isset($string) ? $string : ''));
            
            // Format gotowego Identyfikatora
            return sprintf ('s-s-%s',
                 substr ($base, 0, 8),
                 substr ($base, 8, 4),
                 substr ($base, 12, 4),
                 substr ($base, 16, 4),
                 substr ($base, 20, 12)
            );
       }

Przykład użycia:

  <?php echo uuid('http://www.blog.pl/2007-08-27/witaj-swiecie/') ?>

Efekt działania funkcji uuid() powinien zwrócić :

  fa2eedf2-8ac8-24e3-7314-0d117b62a5ea

Tag

Mark Pilgrim proponuje rozwiązanie, które jest połączeniem obu tych metod — Tag URI.


Zmodyfikowano: 04.11.2013, 11:11
submit