Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[ASP] Random getal op basis van parsetime

Pagina: 1
Acties:

  • Gumball
  • Registratie: December 2003
  • Niet online
Hallo,

voor een webapplicatie moet ik een random id genereren, deze is gebasseerd op datum en tijd.
Dat ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
klant_id_go = "no"
klant_id = Year(now)
klant_id = klant_id & Month(Now)
klant_id = klant_id & Day(Now)
klant_id = klant_id & Hour(Now)
klant_id = klant_id & Minute(Now)
klant_id = klant_id & Second(Now)
klant_id = klant_id & timer


do until klant_id_go = "yes"
    strsqlsql = "select id from klanten where klant_id = '"&klant_id&"'"
        %>
            <!--#include file="../include/SQLServer/SQLServer_read_database_conn.inc"-->
        <%
    if NOT (objrssql.eof or objrssql.bof) then
        klant_id = Year(now)
        klant_id = klant_id & Month(Now)
        klant_id = klant_id & Day(Now)
        klant_id = klant_id & Hour(Now)
        klant_id = klant_id & Minute(Now)
        klant_id = klant_id & Second(Now)
        klant_id = klant_id & timer
        
    else
        klant_id_go = "yes"
    end if
loop



voorbeeld van output:

20071028461831578.84

Nu is dit nummer niet uniek genoeg, want als je heel toevallig exact tegelijk dit nummer genereerd, dan krijgen we dus 2 dezelfde ID's en dat gaat niet goed met het linken aan de producten die bij dat ID horen.
Nu heb ik de volgende code erbij gezet:
code:
1
2
3
Dim randomgetal
Randomize
randomgetal = Int(Rnd * 99999)+1000


Maar dit is ook gebasseerd op datum en tijd, zodat ik als ik 2 dezelfde ID's genereer, het randomgetal ook identiek is.

Nu had ik dus gedacht om het ID & de tijd van het parsen van de pagina in miliseconden er bij te plaatsen maar ik kan dus nergens vinden hoe dat werkt in ASP.
In seconden lukt me wel, maar dat lijkt me niet erg handig.

Heeft iemand een idee hoe dit werkt, of misschien een compleet andere idee om een uniek (of zo uniek mogelijk) getal te genereren? Lengte is in principe geen bezwaar, mits het natuurlijk geen getallan van 4o karakters worden.

[ Voor 31% gewijzigd door Gumball op 02-10-2007 10:45 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gewoon de auto increment van je db gebruiken? Id's moet je betekenisloso houden, dus ook datum erin verwerken is onzin, daar kan je een mooi datumveld voor maken.

{signature}


  • Gumball
  • Registratie: December 2003
  • Niet online
het getal moet al voor een insert bekend zijn, dus auto incrediment lijkt me dan geen optie.

  • Gurbe de n00b
  • Registratie: Juni 2003
  • Laatst online: 08-02-2024
Is er geen mogelijkheid om te controleren of hij in uniek is ?
Gewoon in een loop en als hij uniek is dan breekt hij er uit oid.

Portfolio


  • Steephh
  • Registratie: Juni 2003
  • Laatst online: 29-11 16:55
Dan lees je eerst het laatst gebruikte getal uit?

_@/'


  • Gumball
  • Registratie: December 2003
  • Niet online
het probleem dat ik moet tackelen is: 2 mensen van een zelfde kantoor willen een klant toevoegen in het systeem. Zodra ze op het knopje drukken die toegang geeft tot het formulier dat ze moeten invullen, wordt er een ID gegenereerd.
Als ze dat dus exact tegelijk doen, hebben ze al eenzelfde id, en gezien dit niet direct naar een database wordt verstuurd is er geen controle. (en die controle mag er ook niet komen ivm met andere controles)
Vlak voor een insert vraag ik mij af of het getal al bestaat of niet. Is dat niet zo, insert. Is dat wel zo, update. Maar dat gaat niet op als 2 mensen bij het invullen allebei hetzelfde nieuwe nummer hebben. Hij zal dan het getal van de persoon die als eerste zijn formulier submit inserten, maar van de 2de zal hij updaten.

  • Gumball
  • Registratie: December 2003
  • Niet online
Steephh schreef op dinsdag 02 oktober 2007 @ 10:51:
Dan lees je eerst het laatst gebruikte getal uit?
Kun je iets specifieker zijn? Ik begrijp niet precies wat je bedoeld.

  • Steephh
  • Registratie: Juni 2003
  • Laatst online: 29-11 16:55
Gumball schreef op dinsdag 02 oktober 2007 @ 10:59:
[...]


Kun je iets specifieker zijn? Ik begrijp niet precies wat je bedoeld.
Laat maar, dit werkt niet. Dit was als je je database ID gebruikt. Ik snap het niet.. Denk je echt dat je website zooo ontzettend veel gebruikt gaat worden dat het zoo vaak voorkomt dat er dubbele id's gevormd zullen worden? Hoeveel nieuwe klanten krijg je er per dag bij? 20 miljard?

Wat je zou kunnen doen is een soort van tijdelijk klantennummer die pas definitief wordt nadat in de database is gecontroleerd dat hij niet al bestaat.

_@/'


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:45

TeeDee

CQB 241

Voordat je gaat inserten een select uitvoeren op de max (id) oid.

Moet toch wel zeggen dat het ontwerp een beetje vaagjes is.

Waarom genereer je niet een id (autoinc/guid/je eigen format) tijdens het inserten in de DB?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Gumball
  • Registratie: December 2003
  • Niet online
Steephh schreef op dinsdag 02 oktober 2007 @ 11:07:
[...]


Laat maar, dit werkt niet. Dit was als je je database ID gebruikt. Ik snap het niet.. Denk je echt dat je website zooo ontzettend veel gebruikt gaat worden dat het zoo vaak voorkomt dat er dubbele id's gevormd zullen worden? Hoeveel nieuwe klanten krijg je er per dag bij? 20 miljard?

Wat je zou kunnen doen is een soort van tijdelijk klantennummer die pas definitief wordt nadat in de database is gecontroleerd dat hij niet al bestaat.
De kans dat het gebeurt dat je, op de miliseconde nauwkeurig, de zelfde pagina induikt en dus een nummer genereerd is erg klein, bij het testen is het ons toch een aantal malen gelukt.De kans is gewoon te groot voor ons dat het een keer gaat gebeuren. En we werken inderdaad met heel veel klanten.

  • Gumball
  • Registratie: December 2003
  • Niet online
TeeDee schreef op dinsdag 02 oktober 2007 @ 11:07:
Voordat je gaat inserten een select uitvoeren op de max (id) oid.

Moet toch wel zeggen dat het ontwerp een beetje vaagjes is.

Waarom genereer je niet een id (autoinc/guid/je eigen format) tijdens het inserten in de DB?
Ik bouw verder op wat een collega ooit eens is begonnen, Ik zal het zometeen even navragen waarom, maar er zat een goede reden bij }:O

heeeft er toevallig iemand een idee over het de parsetime?

[ Voor 5% gewijzigd door Gumball op 02-10-2007 11:16 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:45

TeeDee

CQB 241

Gumball schreef op dinsdag 02 oktober 2007 @ 11:15:
[...]


Ik bouw verder op wat een collega ooit eens is begonnen, Ik zal het zometeen even navragen waarom, maar er zat een goede reden bij }:O
Ben erg benieuwd naar de reden ;)

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Steephh schreef op dinsdag 02 oktober 2007 @ 11:07:
Denk je echt dat je website zooo ontzettend veel gebruikt gaat worden dat het zoo vaak voorkomt dat er dubbele id's gevormd zullen worden? Hoeveel nieuwe klanten krijg je er per dag bij? 20 miljard?
Tijd besteed aan het voorkomen van dit soort race conditions valt in het niet vergeleken met de tijd die je kwijt kan zijn als je eenmaal een situatie hebt waarbij je achteraf slecht reproduceerbare bugs mag gaan fixen.

{signature}


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 30-11 16:48
Gumball schreef op dinsdag 02 oktober 2007 @ 10:58:
het probleem dat ik moet tackelen is: 2 mensen van een zelfde kantoor willen een klant toevoegen in het systeem. Zodra ze op het knopje drukken die toegang geeft tot het formulier dat ze moeten invullen, wordt er een ID gegenereerd.
Twee goede mogelijkheden:
• Bij het tonen van het formulier het ID leeg laten, zodta je het auto-inc van de db kan gebruiken. Daar is 'ie voor gemaakt.
• Bij het tonen van het formulier een leeg record (incl. auto-inc) aanmaken (evt. met een uniek kenmerk in de naam) en dan het record opvragen (en dus ook het ID) en dit record tonen in het formulier.

  • Gumball
  • Registratie: December 2003
  • Niet online
jvdmeer schreef op dinsdag 02 oktober 2007 @ 11:18:
[...]


Twee goede mogelijkheden:

• Bij het tonen van het formulier een leeg record (incl. auto-inc) aanmaken (evt. met een uniek kenmerk in de naam) en dan het record opvragen (en dus ook het ID) en dit record tonen in het formulier.
Dat is op zich nog een best idee!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt natuurlijk ook pas het klantnummer tonen nadat de klant is opgeslagen. Wat boeit het nou om het (eventuele, uiteindelijke) klantnummer te weten voordat je 'm opslaat :?

Trust me, je werkt jezelf in de nesten zo. Het is in de meeste gevallen compleet nutteloos om het nummer dat 'ie zou krijgen als je 'm op zou slaan op voorhand te weten. En met een auto-inc veldje in je DB en het nummer achteraf tonen ben je er al.


Overigens: "once a user complains that he wants to see a primary key you're in big trouble" - Joe Celko

[ Voor 53% gewijzigd door RobIII op 02-10-2007 12:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Blue-eagle
  • Registratie: September 2000
  • Niet online
RobIII schreef op dinsdag 02 oktober 2007 @ 11:24:
Je kunt natuurlijk ook pas het klantnummer tonen nadat de klant is opgeslagen. Wat boeit het nou om het (eventuele, uiteindelijke) klantnummer te weten voordat je 'm opslaat :?

Trust me, je werkt jezelf in de nesten zo. Het is in de meeste gevallen compleet nutteloos om het nummer dat 'ie zou krijgen als je 'm op zou slaan op voorhand te weten. En met een auto-inc veldje in je DB en het nummer achteraf tonen ben je er al.
Compleet nutteloos is het blijkbaar niet - het lijkt erop dat het systeem een klant id nodig heeft voor andere dingen. Niet dat het een goede opzet is, maar dat is niet belangrijk in een bestaand systeem.

Wat altijd uniek is, is een GUID:
Visual Basic:
1
2
3
4
5
6
    Function GetGuid() 
        Set TypeLib = CreateObject("Scriptlet.TypeLib") 
        GetGuid = Left(CStr(TypeLib.Guid), 38) 
        Set TypeLib = Nothing 
    End Function 
    Response.Write GetGuid() 

Vervang de -streepjes- en rare {kringel haakjes} met "niks" et voila: een uniek "id" ;)

  • Gumball
  • Registratie: December 2003
  • Niet online
RobIII schreef op dinsdag 02 oktober 2007 @ 11:24:
Je kunt natuurlijk ook pas het klantnummer tonen nadat de klant is opgeslagen. Wat boeit het nou om het (eventuele, uiteindelijke) klantnummer te weten voordat je 'm opslaat :?

Trust me, je werkt jezelf in de nesten zo. Het is in de meeste gevallen compleet nutteloos om het nummer dat 'ie zou krijgen als je 'm op zou slaan op voorhand te weten. En met een auto-inc veldje in je DB en het nummer achteraf tonen ben je er al.
Als het zo makkelijk was geweest hadden we heus wel voor aut-inc. gekozen. het probleem is dat we met tabjes werken en dat meerdere tabellen hetzelfde ID nodig hebben. Ik snap dat het misschien heel vaag klinkt wat ik nu vertel, maar de situatie is inderdaad en beetje niet-standaard. Feit is in ieder geval dat autoincrediment geen optie is.

Ik zal het 2de idee van jvdmeer opvolgen, dit is zal waarschijnlijk goed werken. Sorry voor de vage probleem omschrijving. (ben ook nog maar een nieuweling op dit gebied)
Ik denk dat ik wel weer even verder kan. Bedankt!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Blue-eagle schreef op dinsdag 02 oktober 2007 @ 11:47:
[...]
Wat altijd uniek is, is een GUID:
Helpdeskmedewerker: Wat is uw klantnummer meneer?
Klant: 10860D621FCF4C27ACF6E8D81C692350
7(8)7

Uiteraard kun je een GUID gebruiken als klant-id; maar wat ik uit dit topic haal is dat het om een klantnummer gaat, en dat is toch nét iets anders en moet net zo goed uniek zijn ;)

[ Voor 26% gewijzigd door RobIII op 02-10-2007 11:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan toch ook iets van de medewerker in het nummer verwerken?

Voor de rest ben ik het met bovenstaande mensen eens dat je het nummer niet perse hoeft te weten voordat je een klant toevoegt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
rwb schreef op dinsdag 02 oktober 2007 @ 12:09:
Je kan toch ook iets van de medewerker in het nummer verwerken?
En dus betekenis toevoegen aan een synthetisch id. Het kunnen herleiden van een medewerker (ookal zou je niet verder komen dan het nummertje) uit het klantnummer is een ongewenst neveneffect.

{signature}


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

RobIII schreef op dinsdag 02 oktober 2007 @ 11:52:
Uiteraard kun je een GUID gebruiken als klant-id; maar wat ik uit dit topic haal is dat het om een klantnummer gaat, en dat is toch nét iets anders en moet net zo goed uniek zijn ;)
Voutloos schreef op dinsdag 02 oktober 2007 @ 12:23:
[...]
En dus betekenis toevoegen aan een synthetisch id. Het kunnen herleiden van een medewerker (ookal zou je niet verder komen dan het nummertje) uit het klantnummer is een ongewenst neveneffect.
Wie zegt dat die data letterlijk in het klantnummer moet staan? Er wordt gezegd "erin verwerken", dat hoeft niet per se te betekenen dat het er ook duidelijk herkenbaar in staat. Je zou het bijvoorbeeld samen met de huidige tijd kunnen gebruiken als random seed.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Gumball
  • Registratie: December 2003
  • Niet online
Blue-eagle schreef op dinsdag 02 oktober 2007 @ 11:47:
[...]
Compleet nutteloos is het blijkbaar niet - het lijkt erop dat het systeem een klant id nodig heeft voor andere dingen. Niet dat het een goede opzet is, maar dat is niet belangrijk in een bestaand systeem.


Wat altijd uniek is, is een GUID:
Visual Basic:
1
2
3
4
5
6
    Function GetGuid() 
        Set TypeLib = CreateObject("Scriptlet.TypeLib") 
        GetGuid = Left(CStr(TypeLib.Guid), 38) 
        Set TypeLib = Nothing 
    End Function 
    Response.Write GetGuid() 

Vervang de -streepjes- en rare {kringel haakjes} met "niks" et voila: een uniek "id" ;)
Dat is gaaf, dat kende ik niet. Zal er even verder mee stoeien!

EDIT:

Zou je me kunnen vertellen hoe het GUID tot stand komt? (algoritme)
heb iets gelezen dat als het 3de partje begint met een 1, het een op MAC gebasseerd nummer is, maar deze begint met een 1.

[ Voor 11% gewijzigd door Gumball op 02-10-2007 13:12 ]


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Gumball schreef op dinsdag 02 oktober 2007 @ 13:01:
[...]


Dat is gaaf, dat kende ik niet. Zal er even verder mee stoeien!

EDIT:

Zou je me kunnen vertellen hoe het GUID tot stand komt? (algoritme)
heb iets gelezen dat als het 3de partje begint met een 1, het een op MAC gebasseerd nummer is, maar deze begint met een 1.
als ik een opmerking mag maken:

Jullie maken je druk om een id wat wel eens in een uitzonderlijk geval niet uniek is maar ik zou me eerder druk maken over de database die wagenwijd openstaat:

code:
1
strsqlsql = "select id from klanten where klant_id = '"&klant_id&"'"



code:
1
<!--#include file="../include/SQLServer/SQLServer_read_database_conn.inc"-->


+ heb je in SQL server een auto generate GUID functie (new_id())

[ Voor 4% gewijzigd door 4of9 op 02-10-2007 13:25 ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

Gumball schreef op dinsdag 02 oktober 2007 @ 13:01:
Zou je me kunnen vertellen hoe het GUID tot stand komt? (algoritme)
heb iets gelezen dat als het 3de partje begint met een 1, het een op MAC gebasseerd nummer is, maar deze begint met een 1.
Wat is er onduidelijk aan online references, zoals op wikipedia?

http://en.wikipedia.org/wiki/Globally_Unique_Identifier :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Gumball schreef op dinsdag 02 oktober 2007 @ 13:01:
[...]


Dat is gaaf, dat kende ik niet. Zal er even verder mee stoeien!

EDIT:

Zou je me kunnen vertellen hoe het GUID tot stand komt? (algoritme)
heb iets gelezen dat als het 3de partje begint met een 1, het een op MAC gebasseerd nummer is, maar deze begint met een 1.
Ik weet niet hoe het werkt, zeker niet in de Microsoft variant ervan, maar op Wikipedia kan je veel meer vinden :)
4of9 schreef op dinsdag 02 oktober 2007 @ 13:24:
[...]

+ heb je in SQL server een auto generate GUID functie (new_id())
Inderdaad :)
Visual Basic:
1
2
3
    set conn = CreateObject("ADODB.Connection") 
    conn.open "<connection string>" 
    set rs = conn.execute("SELECT newid()") 

Maar dat werkt weer niet als je een Access database gebruikt ;)

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Waarom lock je de tabel niet gewoon als er een nieuw record in gezet moet worden?

Dan laat je, indien de database gelocked is, het programma gewoon voor een bepaalde tijd opnieuw proberen, 3 seconden of zo.
Een INSERT query duurt echt niet meer dan 1 seconde (ligt er natuurlijk aan wat je precies doet in die query, maar je snapt mijn punt), daar kan de klant echt wel even op wachten. :)

Na de INSERT-query unlock je de tabel gewoon weer.

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


  • Gumball
  • Registratie: December 2003
  • Niet online
veiligheid wordt nog aan gewerkt, dat komt wel goed.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
%


' Klant_id bepalen en controle of deze reeds bestaat
' **************************************************

klant_id = Year(now)
klant_id = klant_id & Month(Now)
klant_id = klant_id & Day(Now)
klant_id = klant_id & Hour(Now)
klant_id = klant_id & Minute(Now)
klant_id = klant_id & Second(Now)
klant_id = klant_id & timer

Function GetGuid() 
        Set TypeLib = CreateObject("Scriptlet.TypeLib") 
        GetGuid = Left(CStr(TypeLib.Guid), 38) 
        Set TypeLib = Nothing 
    End Function 
    'Response.Write GetGuid() 
    
guid = GetGuid()


lengteguidmin = lengtegid -1

teller = 1
lengteguid = len(guid)
do until teller > lengteguid
    if isnumeric(mid(guid, teller, 1)) = true then
        klant_id = klant_id & mid(guid, teller, 1)
    end if
    teller = teller + 1
loop


' **************************************************
response.write len(klant_id)
%>



Is de nieuwe code die perfect werkt :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

Wat een enorm stuk ranzige code zeg.
• Commentaar komt niet overeen met de werking van de functie
• String bewerking met getallen (terwijl het origneel ook gewoon een (in hex gerepresenteerd) getal is)
• Nuteloos lange klantID waar compleet onnodig een datum in is opgenomen

Neem gewoon de tweede oplossing van jvdmeer. Die is duidelijker, robuuster, efficiënter en voor de hand liggender.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik ben het ook met jvdmeer eens dat je gewoon het best gebruik kunt maken van de auto increment value in je database. Je zou evt. nog een hash kunnen genereren en die als klant id gebruiken (maar dan geen volledige hash maar bijv. de eerste zoveel karakters zoals youtube dat doet)

  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Gumball, ga voor de gein eens kijken naar een betere opzet van je code. Ook met ASP/VB kan je object geörienteerd programmeren, tot op zekere hoogte. Mocht dat teveel moeite zijn, commentariseer je code dan in ieder geval correct (voor jezelf en anderen), en zorg ervoor dat je functies en subprocedures goed onderverdeelt. Dit is pure spaghetti code ;)

(Wat Janoz zegt dus..)

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
als je je include files include als .inc files dan weet je duidelijk niet genoeg over ASP.
Gooi voor de grap eens het path naar de .inc in je browser en zie wat er gebeurt....

Mijn advies aan de TS. Neem het advies aan dat meerdere mensen hier gegeven hebben en ga daarna een boel lezen over ASP en programmeren in het algemeen.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...

Pagina: 1