Kom ihåg mig?
Home Menu

Menu


Få löpnummer att verka slumpmässiga

 
Ämnesverktyg Visningsalternativ
Oläst 2011-06-06, 00:24 #1
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Standard 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

Senast redigerad av qson den 2011-06-06 klockan 00:40
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 00:53 #2
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
znap znap är inte uppkopplad
Medlem
 
Reg.datum: Jun 2007
Inlägg: 114
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
znap är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 08:41 #3
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Ä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?
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 09:37 #4
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
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.
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 14:35 #5
BOM BOM är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2011
Inlägg: 43
BOM BOM är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2011
Inlägg: 43
Lägg in ett extra idfält för unika icke-sekventiella id.

Eller slopa det sekventiella, använd inte auto increment.
BOM är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 15:30 #6
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Citat:
Ursprungligen postat av BOM Visa inlägg
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 Visa inlägg
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.
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 16:04 #7
BOM BOM är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2011
Inlägg: 43
BOM BOM är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2011
Inlägg: 43
Citat:
Ursprungligen postat av qson Visa inlägg
...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)),...)
BOM är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 16:11 #8
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
jonny jonny är inte uppkopplad
Supermoderator
 
Reg.datum: Sep 2003
Inlägg: 6 941
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?
jonny är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 16:42 #9
emilvs avatar
emilv emilv är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Feb 2004
Inlägg: 1 564
emilv emilv är inte uppkopplad
Bara ett inlägg till!
emilvs avatar
 
Reg.datum: Feb 2004
Inlägg: 1 564
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.
emilv är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-06-06, 16:53 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av BOM Visa inlägg
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)),...)
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 16:45.

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