View Full Version : گفتگو: کد شش رقمی غیر تکراری برای بازیابی رمز
ROSTAM2
پنج شنبه 04 مرداد 1403, 06:45 صبح
سلام.
من برای بازیابی رمز تابعی برای ایجاد یک کد شش کاراکتری متغیر ساختم که متشکل از ارقام 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
ROSTAM2
پنج شنبه 04 مرداد 1403, 06:59 صبح
اینم هست:
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
ROSTAM2
پنج شنبه 04 مرداد 1403, 18:55 عصر
آخرین تغییرات:
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
ساخت کد تأیید پست الکترونیک یا کد بازیابی رمز (https://www.aparat.com/v/kcf08zn)
فراهم سازی امنیت کد تأئید پست الکترونیک /کد بازیابی رمز
(https://www.aparat.com/v/lfqi2u8)
mazoolagh
پنج شنبه 04 مرداد 1403, 20:10 عصر
یک راه هم این هست که یک 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 رو ساختم.
ROSTAM2
پنج شنبه 04 مرداد 1403, 20:26 عصر
یک راه هم این هست که یک 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
mazoolagh
جمعه 05 مرداد 1403, 21:13 عصر
خب تصور من این بود که این کد ساخته شده نباید کاراکتر تکراری داشته باشه.
اگر عدم تکرار به خود کد برمیگرده درسته که 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).
Mahmoud.Afrad
سه شنبه 09 مرداد 1403, 03:35 صبح
یکتا بودن زمانی مطرحه که طول رشته محدودیت نداشته باشه.
guid برای این کار مناسب نیست.
برای هر کد تولید شده چند مولفه در نظر بگیرید. شامل استفاده توسط همان شخص درخواست کننده، زمان انقضاء(چند دقیقه) و همچنین یک دوره زمانی(چند روز) که بعد از اون بشه مجدد از کد استفاده کرد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.