sql >> Database >  >> RDS >> Mysql

PHP korte unieke ID-generatie met auto_increment?

Je hebt iets nodig dat correct is qua constructie, d.w.z. een permutatiefunctie:dit is een functie die een één-op-één, omkeerbare toewijzing van een geheel getal (je sequentiële teller) naar een ander uitvoert. Enkele voorbeelden (elke combinatie hiervan zou ook moeten werk):

  • sommige bits omkeren (bijv. met behulp van een XOR, ^ in PHP)
  • de plaatsen van bits verwisselen (($i &0xc)>> 2 | ($i &0x3) <<2), of gewoon de volgorde van alle bits omkeren
  • een constante waarde toevoegen modulo je maximale bereik (moet een factor twee zijn, als je dit combineert met de bovenstaande)

Voorbeeld:deze functie converteert 0, 1, 2, 3, 5, .. naar 13, 4, 12, 7, 15, .. voor getallen tot 15:

$i=($input+97) & 0xf;
$result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;

BEWERKEN

Een eenvoudigere manier zou zijn om een ​​lineaire congruente generator (LCG, die gewoonlijk wordt gebruikt voor het genereren van willekeurige getallen) te gebruiken, die wordt gedefinieerd door een formule van de vorm:

X_n+1 = (a * X_n + c) mod m

Voor goede waarden van a, c en m, zal de reeks van X_0, X_1 .. X_m-1 alle getallen tussen 0 en m-1 precies één keer bevatten. Nu kunt u beginnen met een lineair stijgende index en de volgende . gebruiken waarde in de LCG-reeks als uw "geheime" sleutel.

EDIT2

Implementatie:u kunt uw eigen LCG-parameters ontwerpen , maar als je het fout hebt, zal het niet het volledige bereik dekken (en dus duplicaten hebben), dus ik zal een gepubliceerde en uitgeprobeerde set parameters hier gebruiken van dit artikel :

a = 16807, c = 0, m = 2147483647

Dit geeft u een bereik van 2**31. Met pack() kun je het resulterende gehele getal als een string krijgen, base64_encode() maakt er een leesbare string van (van maximaal 6 significante karakters, 6 bits per byte), dus dit zou jouw functie kunnen zijn:

substr(base64_encode(pack("l", (16807 * $index) % 2147483647)), 0, 6)


  1. Productvarianten modelleren

  2. Gebruik IDENT_CURRENT() om de huidige identiteitswaarde op een identiteitskolom in SQL Server te retourneren

  3. Waarom SQLSTATE[HY000]:algemene fout?

  4. MySQL top 2 records per groep