Tänkte utveckla en liten vykortstjänst och behöver då slumpa fram en sträng som är 10 tecken lång och ska innehålla bokstäver och siffror. Förstår att jag ska använda mig utav reguljära uttryck men jag har ingen erfarenhet utav detta. Någon som kan knuffa mig i rätt riktning?
slumpa bokstäver & siffror
18 svar · 4 940 visningar · startad av nanne
Hej!
Jag har en PSW generator jag pillade med en gång liggandes, skall leta upp den och postar senare här min lösning. För minns inte exakt hur jag gjorde.
Ha det!
Hej, jag har själv en vykorts sida där jag slumpar fram bokstäver blandat med siffror.
Du kan använda följande:
dim i, id
for i=0 to 4
Randomize
id=id & int(9*rnd) & chr(Int(26 * Rnd)+97)
next
här blir varannat tal en siffra och varannat en bokstav.
chr omvandlar ju ett tal till tecken och rnd sköter ju slumpningen.
hoppas det funkar.
TACK!... funkar finfint!
Trevligt att ni har löst det redan, men postar endå en annan lösning som slumpar ut stora/små bokstäver med siffror.
<%
Passwordeller = ""
Randomize
For i = 1 to 10
intNum = Int(10 * Rnd + 48)
intBig = Int(26 * Rnd + 65)
intSmall = Int(26 * Rnd + 97)
intRand = Int(3 * Rnd + 1)
Select Case intRand
Case 1
delPasseller = Chr(intNum)
Case 2
delPasseller = Chr(intBig)
Case 3
delPasseller = Chr(intSmall)
End Select
Passwordeller = Passwordeller & delPasseller
Next
response.write(Passwordeller & "<br>")
%>
Ha det!
Brimba skrev:
Trevligt att ni har löst det redan, men postar endå en annan lösning som slumpar ut stora/små bokstäver med siffror.
<% Passwordeller = "" Randomize For i = 1 to 10 intNum = Int(10 * Rnd + 48) intBig = Int(26 * Rnd + 65) intSmall = Int(26 * Rnd + 97) intRand = Int(3 * Rnd + 1) Select Case intRand Case 1 delPasseller = Chr(intNum) Case 2 delPasseller = Chr(intBig) Case 3 delPasseller = Chr(intSmall) End Select Passwordeller = Passwordeller & delPasseller Next response.write(Passwordeller & "<br>") %>Ha det!
------------------
Mvh
Patrik
aka Brimba
vet att tråden är gammal, men kan du förklara hur du tänkt?
intBig = Int(26 * Rnd + 65)
intSmall = Int(26 * Rnd + 97)
I ovanstående kod förstår jag att
26 betyder att du har använt 26 bokstäver, men var lägga till 65 respektive 97?
och varför
intRand = Int(3 * Rnd + 1)
men var lägga till 65 respektive 97?
Om frågan är varför, så ta en titt på närmaste asciitabell (till exempel http://www.lookuptables.com/) så ser du att teckenkoderna för versaler börjar på 65, och gemener på 97.
26 betyder att du har använt 26 bokstäver,
Snarare hur många bokstäver det finns, inte hur många som här använts. Koden slumpar ju bara fram ett tecken i taget.
och varför
intRand = Int(3 * Rnd + 1)
Den slumpningen bestämmer i vilken ordning det skall komma en siffra, en gemen eller en versal. Titta på select case-satsen i koden.
@nders skrev:
citat]och varför
intRand = Int(3 * Rnd + 1)en slumpningen bestämmer i vilken ordning det skall komma en siffra, en gemen eller en versal. Titta på select case-satsen i koden.
ajg tittar, men blri inte klokare för det
Som jag förstår så slumpar de olika "case" fram 1 siffra, 1 gemen och 1 versal
men fattar inte vad
intRand = Int(3 * Rnd + 1)
har för roll i det hela?
intRand kan få värdena 1, 2 eller 3 genom den koden.
0 < Rnd < 1
Han ser alltså det som tre alternativ som passar in fint på de tre alternativ som finns för nästa tecken i lösenordet (big, small eller int). Är intRand 1 blir nästa tecken numeriskt, 2 = liten bokstav och 3 stor bokstav.
Koden lägger ett slumptal mellan 1 och 3 i variabeln intRand.
intRand bestämmer sedan, i select case-satsen, om det är en siffra, en gemen eller en versal som ska väljas för detta tecken.
@nders skrev:
Koden lägger ett slumptal mellan 1 och 3 i variabeln intRand.
intRand bestämmer sedan, i select case-satsen, om det är en siffra, en gemen eller en versal som ska väljas för detta tecken.
tack, men hur kan ni/jag dra denna slutsats
ptr_lks skrev:
tack, men hur kan ni/jag dra denna slutsats
Som jag skrev ovan. Vi vet att Rnd ligger mellan 0 och 1.
0 < Rnd < 1
3 * Rnd ligger alltså mellan 0 och 3
0 < 3*Rnd < 3
+1 borde vara förståeligt.
1 < 3*Rnd + 1 < 4
Int() kapar helt enkelt av alla eventuella decimaler.
3.99 blir således 3.
cyprys skrev:
Som jag skrev ovan. Vi vet att Rnd ligger mellan 0 och 1.
0 < Rnd < 1
3 * Rnd ligger alltså mellan 0 och 3
0 < 3*Rnd < 3+1 borde vara förståeligt.
1 < 3*Rnd + 1 < 4Int() kapar helt enkelt av alla eventuella decimaler.
3.99 blir således 3.
ja, så långt hänger jag altså med men inte med kopplingen med "case"
Han har en for-lopp som itererar 10 ggr. Varje loop lägger han till ett tecken till lösenordssträngen. Vilket slags tecken som läggs till bestäms genom select case-satsen.
for i = 0 to 10
' slumpa fram ett tecken för varje sort. (num, big, small)
' fixa en variabel som slumpvis har värdet 1, 2 eller 3
select case slumpvariabel
case 1 : lösenord = lösenord & siffra
case 2 : lösenord = lösenord & versal
case 3 : lösenord = lösenord & gemen
end select
exit for
returnera lösenord
Om det är hur select case fungerar som du har problem med... http://www.asp101.com/samples/case.asp
tänk att jag är blind på ögat
Läste inte riktigt "select case satsen"...
Den jag har på min E-kortsida tar datum och tid och gör till en unik sträng för varje kort
<%=replace(Date(),"-","")%><%=replace(Time(),":","")%><%=left(replace(Time(),":",""),4)%>
Många olika lösningar i den här tråden. Men jag anser att hemmabyggena i den här tråden står sig ganska dåligt mot en riktig guid.
Antingen skapar man den direkt i databasen eller använder en funktion.
Function GetGuid()
Dim objTypeLib, sGuid
Set objTypeLib = Server.CreateObject("Scriptlet.TypeLib")
sGuid = objTypeLib.Guid
Set objTypeLib = Nothing
GetGuid = Left(sGuid, Len(sGuid) - 2)
End Function
En annan lösning är att använda en saltad md5 på deagnes datum och tid. Pseudokod, ej ASP!
kod = md5(getTime() & "blabla")
' Ska det vara 10 tecken:
kod = left(md5(getTime() & "blabla"), 10)




