Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,501

    Generare un codice univoco

    In realtà c'entra poco con PHP o con qualsiasi altro linguaggio di programmazione, ma da qualche parte devo chiedere.

    In una tabella devo inserire dei prodotti, per l'id vorrei evitare il solito int auto_increment ed usare un codice generato da me, ma che mi dia la certezza dell'unicità.

    Quando un inserzionista inserisce un prodotto si indicherà anche la quantità, ma se si specifica che la vendita sarà al dettaglio e non in stock, verrà generata un'inserzione diversa per ogni unità di prodotto.

    Esempio:
    si inserisce
    3 scarpe pippo 35€ al dettaglio

    sul db si avrà
    scarpe pippo 35€
    scarpe pippo 35€
    scarpe pippo 35€

    Non chiedetemi perché, va fatto così.

    Al momento sto pensando di usare 3 caratteri del nome dell'inserzionista, poi mi servirebbe un codice univoco (pensavo a time() ).
    Così mi verrebbe fuori un codice di 13 caratteri.

    Idee per un codice univoco più breve ed elegante?

  2. #2
    Se lesini sulla lunghezza metti a rischio l'unicità. Secondo me potrebbe bastare anche il semplice time() senza i 3 caratteri dell'inserzionista.

    [EDIT]
    Anche se in questo modo due invocazioni contemporanee potrebbero avere lo stesso time(). Forse è meglio che lasci anche i caratteri
    [/EDIT]
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,501
    Si ed aggiungerei anche un numero progressivo alla fine.
    L'esempio di prima potrebbe riportare lo stesso ID per tutti e 3 gli inserimenti se il db ci mette meno di 1ms a fare tutto.

    Sapendo la quantità potrei quindi fare
    inserzionista: Topolino
    prodotto: scarpe Pippo
    prezzo 35€
    quantità: 3
    vendita: dettaglio

    timestamp preso: 1344351680
    ID generati:
    Top13443516801
    Top13443516802
    Top13443516803

  4. #4
    Però il rischio di violare l'unicità rimane, per quanto basso. Se due inserzionisti (Topolino e Topolina) si collegano contemporaneamente, teoricamente potrebbero generare lo stesso id (considerando i primi 3 caratteri del nome ad esempio)

    Ovviamente sono eventialità remote, ma pur sempre verificabili.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,501
    Ci avevo pensato a questa eventualità, ma la ritengo abbastanza improbabile da poterla accettare.
    Essendo il codice una primary key, chi arriva secondo si becca un errore e riprova, al secondo giro non può andargli male di nuovo, altrimenti che giochi al superenalotto.

  6. #6
    ...gurdate che c'è una funzione apposta: uniqid( ).

    http://php.net/manual/en/function.uniqid.php


  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,501
    Lo so, ma fa praticamente la stessa cosa di time()
    Gets a prefixed unique identifier based on the current time in microseconds

  8. #8
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    veramente farebbe più o meno la stessa cosa di microtime
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  9. #9
    Originariamente inviato da Alhazred
    Lo so, ma fa praticamente la stessa cosa di time()
    ...praticamente....

    perché al contrario di microtime() se viene chiamata più volte nello stesso millisecondo genera valori diversi,
    inoltre se la la chiami con uniqid(TRUE);

    "will add additional entropy (using the combined linear congruential generator) at the end of the return value, which increases the likelihood that the result will be unique."

    EDIT:
    ah cmq nel caso specifico la maniera più efficiente resta comunque sempre l'auto_increment di mySql

  10. #10
    se gli inserimenti multipli avvengono con query multiple per aggirare i problemi precedenti citati con il microtime() potresti piazzarci tra un inserimento e l'altro un usleep.

    http://www.php.net/manual/en/function.usleep.php
    Codice PHP:
    $first microtime();
    usleep(1000);
    $second microtime();
    echo 
    '<pre>';
    if(
    $first==$second){
        echo 
    'sleep insufficiente\r\n';
        }
    else{
        echo 
    'sleep ok : ' . ($second $first) . "\r\n";
        echo 
    $first "\r\n";
        echo 
    $second "\r\n";
        } 
    Io propenderei per una soluzione + raffinata:
    creare una funzione ricorsiva che ti genera stringhe (magari con keywords associate al prodotto) che, qualora risulti essere già presente, concatena alla stringa data numeri/lettere e che si stoppa quando non questa non è presente nel db.
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.