sql >> Databasteknik >  >> RDS >> Mysql

PHP kort unikt ID-generering med auto_increment?

Du behöver något som är korrekt genom konstruktion, d.v.s. en permutationsfunktion:det här är en funktion som gör en en-till-en, reversibel mappning av ett heltal (din sekventiella räknare) till ett annat. Några exempel (valfri kombination av dessa bör också arbete):

  • invertera några av bitarna (t.ex. med hjälp av en XOR, ^ i PHP)
  • byta plats för bitar (($i &0xc)>> 2 | ($i &0x3) <<2), eller bara omvänd ordning på alla bitar
  • lägga till ett konstant värde modulo ditt maximala intervall (måste vara en faktor två, om du kombinerar detta med de ovan)

Exempel:den här funktionen konverterar 0, 1, 2, 3, 5, .. till 13, 4, 12, 7, 15, .. för nummer upp till 15:

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

REDIGERA

Ett enklare sätt skulle vara att använda en linjär kongruentialgenerator (LCG, som vanligtvis används för att generera slumptal), som definieras av en formel av formen:

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

För bra värden av a, c och m, kommer sekvensen av X_0, X_1 .. X_m-1 att innehålla alla tal mellan 0 och m-1 exakt en gång. Nu kan du börja från ett linjärt ökande index och använda nästa värde i LCG-sekvensen som din "hemliga" nyckel.

EDIT2

Implementering:Du kan designa dina egna LCG-parametrar , men om du missför det kommer det inte att täcka hela intervallet (och därmed ha dubbletter) så jag använder en publicerad och beprövad uppsättning parametrar här från denna tidning :

a = 16807, c = 0, m = 2147483647

Detta ger dig en räckvidd på 2**31. Med pack() kan du få det resulterande heltal som en sträng, base64_encode() gör det till en läsbar sträng (med upp till 6 signifikanta tecken, 6 bitar per byte) så detta kan vara din funktion:

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


  1. Återanslutningen på MySQL Server har försvunnit

  2. PDO MySQL:Infoga flera rader i en fråga

  3. Jag får dubbla resultat från mysql-frågan när jag använder internationella tecken, dvs Å/Ä=A &Ö=O,

  4. Ändra lösenordet för en SQL Server-inloggning