WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Få löpnummer att verka slumpmässiga (https://www.wn.se/forum/showthread.php?t=1048543)

qson 2011-06-06 00:24

Få löpnummer att verka slumpmässiga
 
Håller på med ett bokningssystem och försöker komma fram till ett säkert sätt att generera unika bokningsnummer från två fristående system.
Jag vill använda något liknande auto increment men med en extra siffra som identifierar vilket system som skapat bokningen. Jag vill dock att dessa sekventiella (inkrementella) nummer att verka slumpmässiga, men jag vill fortfarande hålla nere längden på numren så mycket som möjligt.

Just nu har jag följande kod för att skapa unika nummer:
PHP-kod:

$luid 301// Local unique id, auto_increment
$cuid 1// client/system id
$checksum $luid % 8; // % skall vara ett procenttecken, alltså modulo 
$prefix = ($cuid $checksum) + 1;

$id $prefix $luid

301 => 5301
302 => 8302
303 => 7303

Villfå dessa tal att "verka" mer slumpmässiga. Nu kan man ju följa nummerserien om man skippar första siffran.
Dock vill jag ha kvar möjligheten att kunna få fram CUID ur numret, vilket jag kan nu genom följande formel:
PHP-kod:

$cuid intval( (substr($id01))-1) ^ (intval(substr($id1)) % 8


znap 2011-06-06 00:53

Mcrypt är det vanliga i php, kommer dock inte native. Annars kan du använda base64_encode men om grundproblemet anses som en säkerhetsrik så bör du absolut titta på Mcrypt. Har du testa att google typ, php decryption script

Magnus_A 2011-06-06 08:41

Är det viktigt för dig att man inte ska kunna följa nummerserier så låter det som att en hashad sträng är rätt för dig. då får du ha en översättningstabell mellan hashen och det ursrpungliga ID hos respektive bokningsbolag. Men du kanske inte har eller vill sätta upp en sådan tabell?

qson 2011-06-06 09:37

Jag ser detta absolut inte som "säkerhetsrisk". Det är bara skönhetsgrejer.
base64 ger även bokstäver vilket jag inte vill ha, och dessutom +30% mer data (=längre bokningsnummer)

mcrypt har jag inte tänkt på, men misstänker att även det det ger längre bokningsnummer.
Skall göra ett test med mcrypt och se vad jag får för resultat.

BOM 2011-06-06 14:35

Lägg in ett extra idfält för unika icke-sekventiella id.

Eller slopa det sekventiella, använd inte auto increment.

qson 2011-06-06 15:30

Citat:

Ursprungligen postat av BOM (Inlägg 20407625)
Lägg in ett extra idfält för unika icke-sekventiella id.

Så har jag nu, ett auto_increment-fält och ett "unikt id"-fält som baseras på auto_increment-värdet som jag visade i tidigare post.
Dock vill jag fortfarande hålla bokningsnumrena så korta som möjligt, därför har jag använt auto_increment med ovanstående omräkning.

Citat:

Ursprungligen postat av BOM (Inlägg 20407625)
Eller slopa det sekventiella, använd inte auto increment.

Om man skall slopa det sekventiella och bara köra slumpmässiga så behöver numret vara ganska långt för att garantera att det är unikt.

BOM 2011-06-06 16:04

Citat:

Ursprungligen postat av qson (Inlägg 20407635)
...Om man skall slopa det sekventiella och bara köra slumpmässiga så behöver numret vara ganska långt för att garantera att det är unikt.

nej, om fältet är primary
upprepa insert med ett slumpid tills den tar emot det, tex:
insert into tabell (ID,...) values (floor(1+(rand()*999999)),...)

jonny 2011-06-06 16:11

OCR-nummer för bankgiro och plusgiro innehåller ofatst två siffror, en för längden och en som är checksiffra. Något sådant kanske?

emilv 2011-06-06 16:42

Ska de verka slumpmässiga men ändå bära med sig all nödvändig information kan du använda ett enkelt chiffer. Så här kan man göra i PHP:

PHP-kod:

function cipher_number($num$key) {
  
$num = (string) $num;
  
$length strlen($num);
  
$result '';
  for(
$i 0$i $length$i++) {
    
$result .= $key[(int) $num[$i]];
  }
  return 
$result;
}

function 
decipher_number($num$key) {
  return 
cipher_number($numarray_flip($key));
}

$key = array(5,6,1,8,2,9,3,0,4,7);
$number 1337;
$new_number cipher_number($number$key); 

Använd samma nyckel för chiffrering och dechiffrering.

Conny Westh 2011-06-06 16:53

Citat:

Ursprungligen postat av BOM (Inlägg 20407641)
nej, om fältet är primary
upprepa insert med ett slumpid tills den tar emot det, tex:
insert into tabell (ID,...) values (floor(1+(rand()*999999)),...)

Borde bli så här för ena systemet "5":

Kod:

insert into tabell (ID,...) values (floor(5000+(rand()*999)),...)
Borde bli så här för andra systemet "6":

Kod:

insert into tabell (ID,...) values (floor(6000+(rand()*999)),...)
Borde bli så här för tredje systemet "7":

Kod:

insert into tabell (ID,...) values (floor(7000+(rand()*999)),...)


Alla tider är GMT +2. Klockan är nu 01:19.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson