1 ضمیمه
کد شش کاراکتری غیر تکراری برای بازیابی رمز
سلام.
من برای بازیابی رمز تابعی برای ایجاد یک کد شش کاراکتری متغیر ساختم که متشکل از ارقام 6 فروند GUID هست که با چرحش در حلقه 6 دوره هربار یک کاراکتر از یک GUID از 12 کاراکتر GUID به یک لیست اضافه می کنه که در نهایت می شه یک کد شش کاراکتری غیر تکراری
اگر راهکاری برای بهتر شدن این تابع دارید اعلام بفرمائید.
با تشکر .....
ضمیمه 155912
Function CreateNewRecoveryCode() As String
Dim TempIDs As New List(Of String)
Dim Guids As Guid() = {Guid.NewGuid, Guid.NewGuid, Guid.NewGuid, Guid.NewGuid, Guid.NewGuid, Guid.NewGuid}
Dim X, I As Byte
X = 0 : I = 0
For Each G As Guid In Guids
X += 1
Select Case X
Case 1 : I = 9
Case 2 : I = 8
Case 3 : I = 11
Case 4 : I = 5
Case 5 : I = 1
Case 6 : I = 4
End Select
TempIDs.Add(G.ToString.Replace("-", "").Substring(I, 1).ToUpper)
Next
Return Join(TempIDs.ToArray).Replace(Space(1), String.Empty)
End Function
نقل قول: کد شش کاراکتری غیر تکراری برای بازیابی رمز
اینم هست:
Function CreateNewRecoveryCode2() As String
Dim TempIDs As New List(Of String)
Dim G As Guid = Guid.NewGuid
Dim I As Byte
I = 0
For X = 1 To 6
Select Case X
Case 1 : I = 9
Case 2 : I = 8
Case 3 : I = 11
Case 4 : I = 5
Case 5 : I = 1
Case 6 : I = 4
End Select
TempIDs.Add(G.ToString.Replace("-", "").Substring(I, 1).ToUpper)
Next
Return Join(TempIDs.ToArray).Replace(Space(1), String.Empty)
End Function
1 ضمیمه
نقل قول: کد شش رقمی غیر تکراری برای بازیابی رمز
آخرین تغییرات:
Function CreateNewRecoveryCode() As String
Dim Expr$ = "", StringGUID$
Dim G As Guid = Guid.NewGuid
StringGUID = G.ToString.Replace("-", "").ToUpper
Dim I As Byte
I = 0
For X = 1 To 8
Select Case X
Case 1 : I = 9
Case 2 : I = 8
Case 3 : I = 11
Case 4 : I = 5
Case 5 : I = 1
Case 6 : I = 4
Case 7 : I = 7
Case 8 : I = 3
End Select
Expr += StringGUID.Substring(I, 1)
Next
Return Expr
End Function
ضمیمه 155916
ساخت کد تأیید پست الکترونیک یا کد بازیابی رمز
فراهم سازی امنیت کد تأئید پست الکترونیک /کد بازیابی رمز
نقل قول: کد شش رقمی غیر تکراری برای بازیابی رمز
یک راه هم این هست که یک char array از A-Z و 0-9 بسازیم
و اون رو random مرتب کنیم
و 6 تاش رو برداریم:
Private rx As Random = New Random()
Function CreateNewRecoveryCode() As String
Dim digits = Enumerable.Range(AscW("0"c), 10).Select(Function(x) ChrW(x))
Dim alphas = Enumerable.Range(AscW("A"c), 26).Select(Function(x) ChrW(x))
Return digits.Concat(alphas).OrderBy(Function(x) rx.Next).Take(6).ToArray
End Function
من اینجا برای راحتی با enumerable.range این لیست A-Z و 0-9 رو ساختم.
نقل قول: کد شش رقمی غیر تکراری برای بازیابی رمز
نقل قول:
نوشته شده توسط
mazoolagh
یک راه هم این هست که یک char array از A-Z و 0-9 بسازیم
و اون رو random مرتب کنیم
و 6 تاش رو برداریم:
Private rx As Random = New Random()
Function CreateNewRecoveryCode() As String
Dim digits = Enumerable.Range(AscW("0"c), 10).Select(Function(x) ChrW(x))
Dim alphas = Enumerable.Range(AscW("A"c), 26).Select(Function(x) ChrW(x))
Return digits.Concat(alphas).OrderBy(Function(x) rx.Next).Take(6).ToArray
End Function
من اینجا برای راحتی با enumerable.range این لیست A-Z و 0-9 رو ساختم.
سلام.
من از Random دستورت خوشم اومد:
Function CreateNewRecoveryCode() As String
Dim Expr$ = "", StringGUID$
Dim G As Guid = Guid.NewGuid
Static R As New Random
StringGUID = G.ToString.Replace("-", "").ToUpper
Do Until Expr.Length = 8
Expr += StringGUID(R.Next(12))
Loop
Return Expr
End Function
نقل قول: کد شش رقمی غیر تکراری برای بازیابی رمز
خب تصور من این بود که این کد ساخته شده نباید کاراکتر تکراری داشته باشه.
اگر عدم تکرار به خود کد برمیگرده درسته که guid ساخته شده یکتا هست،
ولی انتخاب یک تعدادی از کاراکترهای اون (و نه خود guid) الزاما کد یکتا نمیسازه،
هر چقدر هم که پروسه انتخاب این مثلا 6 یا 8 کاراکتر رندوم باشه.
برای همین انتخاب 6 یا 8 کاراکتر اول یا آخر یا وسط یا کلا هر ترکیب دیگه ای همونقدر شانس یکتا بودن داره که رندوم انتخاب بشه،
و این کل انتخاب رندوم رو بی فایده میکنه و میشه اون رو کنار گذاشت:
Function CreateNewRecoveryCode() As String
Dim G As Guid = Guid.NewGuid
Return G.ToString.Replace("-", "").ToUpper.Substring(1, 8)
End Function
اگر یکتا بودن این کد باید گارانتی بشه کل guid رو باید استفاده کنین و نه بخشی از اون.
مورد دیگه ای هم هست:
چون guid وقتی به string تبدیل میشه نمایشی از کد هگزادسیمال هست،
فقط حروف A تا F در کد ساخته شده میاد و این احتمال کد تکراری رو باز هم افزایش میده (در مقایسه با A تا Z).
نقل قول: کد شش رقمی غیر تکراری برای بازیابی رمز
یکتا بودن زمانی مطرحه که طول رشته محدودیت نداشته باشه.
guid برای این کار مناسب نیست.
برای هر کد تولید شده چند مولفه در نظر بگیرید. شامل استفاده توسط همان شخص درخواست کننده، زمان انقضاء(چند دقیقه) و همچنین یک دوره زمانی(چند روز) که بعد از اون بشه مجدد از کد استفاده کرد.