webForumDet fria alternativet

slumpa bokstäver & siffror

ASP

18 svar · 4 931 visningar · startad av nanne

Medlem sedan dec. 19991 749 inlägg
Frågan#1

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?

------------------
Daniel Olsson - Vävkonsult

Personlig sida
KjAM Sekten Community

/N

Medlem sedan dec. 19996 721 inlägg
#2

randomize()
intUnique=Int((9999999999-1)*Rnd + 1)

bara siffror, men det räcker garanterat.

Medlem sedan dec. 19995 874 inlägg
#3

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!

------------------
Mvh
Patrik
aka Brimba

www.datormaklarna.se
patrik@datormaklarna.se

Medlem sedan dec. 19991 072 inlägg
#4

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.

------------------
Fredrik Klarqvist
fredrik.klarqvist@swipnet.se
www.streetwise.se/fredrik/

Medlem sedan dec. 19991 749 inlägg
#5

TACK!... funkar finfint!

------------------
Daniel Olsson - Vävkonsult

Personlig sida
KjAM Sekten Community

/N

Medlem sedan dec. 19995 874 inlägg
#6

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

www.datormaklarna.se
patrik@datormaklarna.se

Medlem sedan juni 2005584 inlägg
#7

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

www.datormaklarna.se
patrik@datormaklarna.se

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)

Medlem sedan juni 200032 967 inlägg
#8

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.

Medlem sedan juni 2005584 inlägg
#9

@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 :q
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?

Medlem sedan dec. 20003 563 inlägg
#10

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.

Medlem sedan juni 200032 967 inlägg
#11

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.

Medlem sedan juni 2005584 inlägg
#12

@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 :q

Medlem sedan dec. 20003 563 inlägg
#13

ptr_lks skrev:

tack, men hur kan ni/jag dra denna slutsats :q

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.

Medlem sedan juni 2005584 inlägg
#14

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 < 4

Int() 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"

Medlem sedan dec. 20003 563 inlägg
#15

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

Medlem sedan juni 2005584 inlägg
#16

tänk att jag är blind på ögat ;)
Läste inte riktigt "select case satsen"...

Medlem sedan feb. 20032 027 inlägg
#17

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)%>

Medlem sedan maj 200010 687 inlägg
#18

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
Medlem sedan aug. 20039 340 inlägg
#19

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)
261 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)