Ma'lumotlar bazasi jadvalidagi har bir yozuv uchun noyob mag'lubiyat

Asp.Net MVC 5 loyihasida MS SQL ma'lumotlar bazasi bilan ishlash uchun avval men Entity Framework kodidan foydalanaman. Masalan, bu jadval:

public class Ticket
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string ReferenceCode { get; set; }

    //Rest of the table
}

Ushbu jadvalda, yangi kod qo'shsam, ReferenceCode ustunini noyob va tasodifiy AlphaNumeric (faqat harf va raqamlardan iborat) uzunligi bilan bo'lishini istayman. Bu, masalan, foydalanuvchilarga ma'lum bir chipta murojaat qilish imkonini beradi.

Ular 10 belgidan iborat uzunlikdagi ba'zi misollar: TK254X26W1 , W2S564Z111 , 1STT135PA5 ...

Hozir men ushbu uzunlik bilan tasodifiy satrlarni ishlab chiqa olaman. Biroq, ularning noyobligi ga qanday kafolat berishni amin emasman. Men shunday qilaman:

db.Tickets.Add(new Ticket()
{
   ReferenceCode = GenerateRandomCode(10),
   //...
});

To'liq bo'lish uchun, men yaratgan mag'lubiyatni boshqa yozuvlar uchun ishlatilmaganligiga ishonch hosil qilish uchun GenerateRandomCode funktsiyasini yoki boshqa usulni xohlayman.

Har bir yaratilgan kodni tekshirish uchun for pastadiridan foydalanishim mumkin, lekin yaxshi fikr deb o'ylamayman. Ayniqsa, stolda minglab yozuvlar bo'lgan vaqtdan keyin.

7
@DavidG Xo'sh, bu etarli darajada aniq, deb o'ylayman, lekin men tahrir qilaman.
qo'shib qo'ydi muallif Alireza Noori, manba
@Evk Men ishonchim komil emas, lekin shunga o'xshash nusxa olish imkoniyati va ushbu yozuvga ega bo'lgan foydalanuvchi kodlarni ishlab chiqarish uchun algoritmni qayta tuzish imkoniyatiga ega emasligini o'ylayman. Bunday holatda tasodifiy kodni ishlatish yaxshiroq emasmi? Siz nima deb o'ylaysiz?
qo'shib qo'ydi muallif Alireza Noori, manba
Afsuski, ha. Foydalanuvchilar kodni taxmin qila olmaydilar. U asosan chiptani ko'rganligini tasdiqlash uchun bor.
qo'shib qo'ydi muallif Alireza Noori, manba
@Evk loyiha ehtiyojlarimga asoslanib, men ham mag'lubiyatga muhtojman. foydalanuvchi nomi va user.Id kabi narsalar. Ular boshqacha, lekin ikkalasi ham kerak.
qo'shib qo'ydi muallif Alireza Noori, manba
Agar siz aniq bo'lishni istasangiz, 10 ta alfasayısal belgining umumiy noyob strtlari soni 36 ^ 10 - bu katta raqam - 3,656,158,440,062,976 . Agar sizda faqatgina bir necha mingli qatorlar mavjud bo'lsa va sizda 1000 000 yozuv mavjud bo'lsa ham, sizning jadvalingizdagi mag'lubiyatni yaratish ehtimoli ancha past. Shu sababli, @ Evkning so'nggi bayonotiga qo'shilaman - bu faqat ReferenceCode-ga noyob taqiqlash (yoki indeks) qo'shish va to'plamni va yangilanishlarni sinab ko'ring.
qo'shib qo'ydi muallif Zohar Peled, manba
U foydalanuvchi chiptani ko'rganini tasdiqlash uchun asosda bor. Ular noyob bo'lganda ham muhimmi? Foydalanuvchining tasodifan boshqa chipta uchun chiptalar kodini ishlab chiqarishi ehtimoli nima? Internet-banking operatsiyalari uchun raqamlarni tekshirish ham (mening ishimda 6 ta raqam) noyob emas.
qo'shib qo'ydi muallif Gert Arnold, manba
Agar foydalanuvchi o'zi yaratgan algoritmni bilmasa, uni taxmin qila olmaydi (asosan kod bazasiga kirish imkoni bor)?
qo'shib qo'ydi muallif Evk, manba
Xo'sh, agar bu ba'zi moliyaviy operatsiyalarni himoya qilish uchun kod bo'lsa va foydalanuvchi kodni koddan bilsa, u holda moliyaviy xavf mavjud edi - men tasodifiy satrlarni (kriptografiya bilan tasodifiy) foydalanishni yaxshi bilaman. Lekin, bu holatda foydalanuvchilarning hech qanday muhandislikni qayta ishlashga harakat qilishlari uchun hech qanday sabab yo'q ko'rinadi. Men xuddi shunga o'xshash maqsadlar uchun deterministik chiziqlarni ishlatardim (bu erda to'g'ridan-to'g'ri idni ochishni istamagan va go'zal ko'rinishga ega bo'lishni xohlamaganman) va menimcha, bu juda yaxshi.
qo'shib qo'ydi muallif Evk, manba
Umuman olganda, tasodifiy mag'lubiyatni istasangiz - faqat ReferenceCode-ga noyob indeks qo'ying, uni yaratib, qo'shing va noyob indeks buzilishi xatosini qo'lga oling (albatta bu juda noyob bo'ladi). Agar ushlangan bo'lsa - yangi magistral hosil qiling va qayta qo'shing.
qo'shib qo'ydi muallif Evk, manba
Siz shu tasmani tasodifiy bo'lishga muhtojmisiz? Ticket.Idni 10 ta belgigacha simvolga aylantira oladigan va orqaga qarab, sizga kerak bo'lgan yagona narsa "yaxshi ko'rinadigan" mos yozuvlar raqamidir.
qo'shib qo'ydi muallif Evk, manba
Buning uchun faqat Ticket.Id ishlatmaslik kerakmi?
qo'shib qo'ydi muallif Evk, manba
Bu savol juda keng (bu sizning hozir 6k dan ortiq vakili borligini bilish kerak).
qo'shib qo'ydi muallif DavidG, manba
Tasodifiy yaratish uchun kodni ishlatmang. shaxsiy statik Tasodifiy tasodifiy = yangi Random (); umumiy statik string RandomString (int uzunligi) {const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; yangi satrni qaytarish (Enumerable.Repeat (belgilar, uzunlik). (s => s [random.next (s.Length)]) ToArray ()); }
qo'shib qo'ydi muallif Bimal Das, manba
Agar siz faqat bir xil Yo'naltiruvchi raqami qo'shsangiz. 1) Noyob kalitni qo'shing Ustunlar uchun Yo'naltiruvchi yo'q2) Jadval 2 uchun "Agar mavjud bo'lmasa" referent kodini (sizning kodingizdan hosil qilasiz) so'rovni qo'shish uchun o'zida saqlab turadigan usuli yarating. Bo'ldi shu
qo'shib qo'ydi muallif Bimal Das, manba

12 javoblar

Siz noreferrer"> Guid dasturidan foydalanishingiz mumkin. noyob (xavfsizlikka nisbatan tasodifiy emas) kalitlarni yaratish uchun buyurtma berish.

bu SO savolidan tortib olish:

Guid g = Guid.NewGuid();
string GuidString = Convert.ToBase64String(g.ToByteArray());
GuidString = GuidString.Replace("=","");
GuidString = GuidString.Replace("+","");
GuidString = GuidString.ToUpper();

ReferenceCode xususiyatiga mos keladigan, ammo uzoqroq (22 belgigacha) mos keladigan yagona kalit yaratadi. Uni yiqitish va X belgilaridan foydalanish endi o'zining o'ziga xosligini kafolatlamaydi.

OZVV5TPP4U6XJTHACORZEQ

6
qo'shib qo'ydi

Tugatilgan yo'ldan adashgan yechimni eslay olasizmi? Ikkita ehtiyoj bor, men buni ko'ra olaman:

  • Tasodifiylik. Siz "deterministik" funktsiyaga ega bo'lolmaysiz, chunki agar kimdir algoritmni taxmin qilishsa, har bir shaxsning chipta raqamlarini aniqlab olishlari mumkin.

  • O'zgarishlar. Rastlantiyani biroz qiyinlashtiradigan ikki nusxadagi chipta nomsiz bo'lishi mumkin emas (siz to'qnashuvlar uchun hisob berishingiz va qayta urinishingiz kerak).

Ammo ikkalasini ham qilolmaysiz, chunki sizda 36 ^ 10 dan ortiq bo'sh joy mavjud. Siz 4 baytni Unikallik va 6 baytni tasodifiylikka ajratishingiz mumkin. Quyida ba'zi bir namuna kodlari mavjud:

public partial class Form1 : Form
{

  private static Random random = new Random();
  private static int largeCoprimeNumber = 502277;
  private static int largestPossibleValue = 1679616; //36 ^ 4

  private static char[] Base36Alphabet = new char[] { '0','1','2','3','4','5','6','7','8','9',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };

  public static string GetTicket(int id)
  {
    int adjustedID = id * largeCoprimeNumber % largestPossibleValue;
    string ticket = IntToString(adjustedID);
    while (ticket.Length < 4) ticket = "0" + ticket;
    return ticket + new string(Enumerable.Repeat(Base36Alphabet, 6) .Select(s => s[random.Next(s.Length)]).ToArray());
  }

  private static string IntToString(int value)
  {
    string result = string.Empty;
    int targetBase = Base36Alphabet.Length;

    do
    {
        result = Base36Alphabet[value % targetBase] + result;
        value = value/targetBase;
    }
    while (value > 0);

    return result;
}

Kodning nima qilishini tezda yechish. Siz o'zingizning int nomingizdan o'tmoqdasiz, bu esa keyinchalik ko'rinishida tasodifiy tarzda ko'rinadi, lekin hech qachon birinchi 1,68 million ta raqam uchun raqamni takrorlamaslik kafolatlanadi.

Keyinchalik, bu int ning int qiymatini oladi va uni 4 raqamli kodga aylantiradi; Bu "yagona qism" dir - dastlabki 1,68 million identifikatsiyaning boshida 4 raqamli kod kafolatlang (sehrli raqamlar sehridir.)

Bu bilan o'ynash uchun yana 6 ta belgi qoldiradi. Faqat ularni tasodifiy belgilar bilan to'ldiring - bu butun 10 raqamli kodni tahmin qilishni qiyinlashtiradi.

Bu ikkala muammoingizni ham hal qiladi. Birinchi million + yozuvlar uchun noyob bo'lishi kafolatlangan. Va bu, albatta, mijoz tomonidan "taxmin qilinadigan" emas, chunki ular algoritmni taxmin qilishsa ham, ular har qanday ID uchun yoriq qilishni istaganlar uchun 2 mlrd.

6
qo'shib qo'ydi
Sizning yondashishingiz Phillyga juda o'xshaydi. Biroq men bu bilan birga bo'ldim, chunki u mening ehtiyojlarim uchun biroz moslashuvchan edi. Men sizni baxtli deb bilaman, ammo afsuski, sayt menga ruxsat bermaydi. Javobingizni yuborish uchun vaqt ajratganingiz uchun tashakkur. Men buni juda qadrlayman.
qo'shib qo'ydi muallif Alireza Noori, manba
Xavotir olmang. Biroq siz oldinga siljishingizdan oldin, muammoning echimini echishingizga ishonch hosil qiling, chunki aks holda siz 10 ta tasodifiy belgi yaratgan bo'lsangiz, takroriy chiptani ishlab chiqarishga o'xshash imkoniyatga ega bo'lasiz.
qo'shib qo'ydi muallif Kevin, manba

Ehtimol, bu sizga yordam beradi

DECLARE @userReportId BIGINT

MODE @userReportId = FLOOR (RAND() * (10000000000000-1) + 1);

4
qo'shib qo'ydi
Bu alfanumerik simli yaratmaydi.
qo'shib qo'ydi muallif Alireza Noori, manba
Ushbu so'rov bilan o'ynang :) ma'lumot turini o'zgartiring
qo'shib qo'ydi muallif Spythere, manba

Mana, mening yagona yondashuvim, unikalligini kafolatlaydi va ba'zi tasodifiyliklarni keltirib chiqaradi.

  1. Use a sequence generator that is guaranteed to give a unique number. Since you're working with SQL Server, this can be an IDENTITY column's value. You could alternatively increment an application-level value within your C# code to achieve this.
  2. Generate a random integer to bring in some randomness to the result. This could be done with Random.Next() and any seed, even the number generated in the preceding step.
  3. Use a method EncodeInt32AsString to convert the integers from the previous two steps into two strings (one is the unique string, one the random string). The method returns a string composed of only the allowed characters specified in the method. The logic of this method is similar to how number conversion between different bases takes place (for example, change the allowed string to only 0-9, or only 0-9A-F to get the decimal/hex representations). Therefore, the result is a "number" composed of the "digits" in allowedList.
  4. Concatenate the strings returned. Keep the entire unique string as-is (to guarantee uniqueness) and add as many characters from the random string to pad the total length to the desired length. If required, this concatenation can be fancy, by injecting characters from the random string at random points into the unique string.

Butun noyob mag'lubiyatni saqlab, bu natija noyobligini ta'minlaydi. Tasodifiy mag'lubiyatdan foydalanib, bu tasodifiylikni keltirib chiqaradi. Maqsadning uzunligi noyob simning uzunligiga juda yaqin bo'lsa, tasodifiylik kafolatlanmaydi.

Mening testimga kelib, Int32.MaxValue uchun EncodeInt32AsString chaqiruvi 6 ta belgidan iborat noyob simvolni qaytaradi:

2147483647: ZIK0ZJ

Shu asosda, 12 ta maqsadli mag'lubiyat uzunligi ideal bo'ladi, 10-da esa oqilona.

The EncodeInt32AsString Method

    /// 
/// Encodes the 'input' parameter into a string of characters defined by the allowed list (0-9, A-Z) ///
 
    /// 
Integer that is to be encoded as a string
    /// 
If zero, the string is returned as-is. If non-zero, the string is truncated to this length
    /// 
    static String EncodeInt32AsString(Int32 input, Int32 maxLength = 0)
    {
       //List of characters allowed in the target string 
        Char[] allowedList = new Char[] {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
            'U', 'V', 'W', 'X', 'Y', 'Z' };
        Int32 allowedSize = allowedList.Length;
        StringBuilder result = new StringBuilder(input.ToString().Length);

        Int32 moduloResult;
        while (input > 0)
        {
            moduloResult = input % allowedSize;
            input /= allowedSize;
            result.Insert(0, allowedList[moduloResult]);
        }

        if (maxLength > result.Length)
        {
            result.Insert(0, new String(allowedList[0], maxLength - result.Length));
        }

        if (maxLength > 0)
            return result.ToString().Substring(0, maxLength);
        else
            return result.ToString();
    }

The GetRandomizedString Method

Endi, avvalgi usul faqat mag'lubiyatni kodlashda g'amxo'rlik qiladi. Teklik va tasodifiylik xususiyatlariga erishish uchun quyidagi mantiq (yoki shunga o'xshash) foydalanish mumkin.

Sharhlarda Kevin EncodeInt32AsString usulini qo'llash bilan quyidagi xavfni ko'rsatdi:

Kodning uzunligi o'zgarmasligi uchun tweaked bo'lishi kerak.   Aks holda, siz hech qachon yakuniy natija uchun kafolatlanmasligingiz noyobdir.   Agar u yordam beradigan bo'lsa, ABCDE (Unique) + ni yaratadigan bir qiymatni ko'rsating   F8CV1 (tasodifiy) ... va keyinchalik, yana bir qiymat hosil qilamiz   ABCDEF (noyob) + 8CV1 (tasodifiy). Har ikkala qiymat ABCDEF8CV1 hisoblanadi.

Bu juda muhim bir nuqta va bu quyidagi va GetRandomizedString usuli bilan muhokama qilinadi, unikal va tasodifiy strings uchun uzunliklarni belgilash. EncodeInt32AsString usuli shuningdek qaytarilgan qiymatni ma'lum bir uzunlikda qoldirish uchun o'zgartirildi.

   //Returns a string that is the encoded representation of the input number, and a random value 
    static String GetRandomizedString(Int32 input)
    {
        Int32 uniqueLength = 6;//Length of the unique string (based on the input) 
        Int32 randomLength = 4;//Length of the random string (based on the RNG) 
        String uniqueString;
        String randomString;
        StringBuilder resultString = new StringBuilder(uniqueLength + randomLength);

       //This might not be the best way of seeding the RNG, so feel free to replace it with better alternatives. 
       //Here, the seed is based on the ratio of the current time and the input number. The ratio is flipped 
       //around (i.e. it is either M/N or N/M) to ensure an integer is returned. 
       //Casting an expression with Ticks (Long) to Int32 results in truncation, which is fine since this is 
       //only a seed for an RNG 
        Random randomizer = new Random(
                (Int32)(
                    DateTime.Now.Ticks + (DateTime.Now.Ticks > input ? DateTime.Now.Ticks/(input + 1) : input/DateTime.Now.Ticks)
                )
            );

       //Get a random number and encode it as a string, limit its length to 'randomLength' 
        randomString = EncodeInt32AsString(randomizer.Next(1, Int32.MaxValue), randomLength); 
       //Encode the input number and limit its length to 'uniqueLength' 
        uniqueString = EncodeInt32AsString(input, uniqueLength);

       //For debugging/display purposes alone: show the 2 constituent parts 
        resultString.AppendFormat("{0}\t {1}\t ", uniqueString, randomString);

       //Take successive characters from the unique and random strings and 
       //alternate them in the output 
        for (Int32 i = 0; i < Math.Min(uniqueLength, randomLength); i++)
        {
            resultString.AppendFormat("{0}{1}", uniqueString[i], randomString[i]);
        }
        resultString.Append((uniqueLength < randomLength ? randomString : uniqueString).Substring(Math.Min(uniqueLength, randomLength)));

        return resultString.ToString();
    }

Namoyish chiqishi

Yuqoridagi usulni turli xil kirish qiymatlari uchun chaqirish quyidagi natijalarga olib keladi:

   Input Int     Unique String  Random String       Combined String 
------------ ----------------- -------------- --------------------- 
         -10            000000           CRJM            0C0R0J0M00
           0            000000           33VT            03030V0T00
           1            000001           DEQK            0D0E0Q0K01
        2147            0001NN           6IU8            060I0U18NN
       21474            000GKI           VNOA            0V0N0OGAKI
      214748            004LP8           REVP            0R0E4VLPP8
     2147483            01A10B           RPUM            0R1PAU1M0B
    21474836            0CSA38           RNL5            0RCNSLA538
   214748364            3JUSWC           EP3U            3EJPU3SUWC
  2147483647            ZIK0ZJ           BM2X            ZBIMK20XZJ
           1            000001           QTAF            0Q0T0A0F01
           2            000002           GTDT            0G0T0D0T02
           3            000003           YMEA            0Y0M0E0A03
           4            000004           P2EK            0P020E0K04
           5            000005           17CT            01070C0T05
           6            000006           WH12            0W0H010206
           7            000007           SHP0            0S0H0P0007
           8            000008           DDNM            0D0D0N0M08
           9            000009           192O            0109020O09
          10            00000A           KOLD            0K0O0L0D0A
          11            00000B           YUIN            0Y0U0I0N0B
          12            00000C           D8IO            0D080I0O0C
          13            00000D           KGB7            0K0G0B070D
          14            00000E           HROI            0H0R0O0I0E
          15            00000F           AGBT            0A0G0B0T0F

Yuqorida aytib o'tilganidek, noyob mag'lubiyat boshqa raqamlar bilan ifodalangan, faqat bitta raqamni hisobga olgan holda ketma-ket raqamlar uchun oldindan taxmin qilinadi. Biroq, tasodifiy mag'lubiyat foydalanuvchilari keyingi raqamlarni aniqlashni oldini olish uchun ba'zi entropiyani keltirib chiqaradi. Bundan tashqari, noyob magistr va tasodifiy string ning "raqamlarini" bir-biriga bossangiz, u foydalanuvchilar uchun biron bir naqshni kuzatish uchun biroz ko'proq qiyinlashadi.

Yuqoridagi misolda, noyob mag'lubiyatning uzunligi 6 ga o'rnatiladi (chunki bu Int32.MaxValue ni ifodalaydi), lekin tasodifiy uzunligi string parametri 4 ga o'rnatilgandir, chunki OP butun uzunligi 10 ta belgidan iborat bo'lishini xohlaydi.

3
qo'shib qo'ydi
Rahmat. Sizning kodingiz asosida kodni o'zgartirish uchun mavjud kodni o'zgartirib, Id ni yozib olamiz va unda asosan noyob iborani qaytarib olaman. Men o'z mezonlarini belgilashim mumkin. Ajoyib.
qo'shib qo'ydi muallif Alireza Noori, manba
Kod barqaror uzunlikdagi mag'lubiyatni qaytarishi uchun tweaked bo'lishi kerak. Aks holda, siz hech qachon yakuniy natija uchun kafolatlanmasligingiz noyobdir. Agar u yordam beradigan bo'lsa, [ABCDE] (noyob) + [F8CV1] (tasodifiy) ... va so'ngra yana [ABCDEF] (original) + [8CV1] (tasodifiy) ni yaratadigan boshqa qiymat hosil qilamiz. Har ikkala qiymat ham ABCDEF8CV1 hisoblanadi.
qo'shib qo'ydi muallif Kevin, manba
@AlirezaNoori - Men allowedList qatorining mazmunida kichik xatoga yo'l qo'ygan bo'ldim. Endi men yuqoridagi javobni tuzatdim. Bu umumiy javobning o'zini o'zgartirmaydi.
qo'shib qo'ydi muallif Phylyp, manba
Juda yoqimli ovchi, Kevin, buni ko'rsatganingiz uchun tashakkur. Javobni ixtiyoriy va tasodifiy strings ma'lum uzunliklarga ega bo'lishini ta'minlaydigan GetRandomizedString usuli bilan o'zgartirdim.
qo'shib qo'ydi muallif Phylyp, manba

rpcrt4.dll -da, UuidCreateSequential usuli (Uuid bilan ishlaydigan) usuli yordamida mashinada mutlaq noyoblikka erishish mumkin. Buni noreferrer"> bog'lash bo'limiga qarang microsoft-dan yagona xususiyatga ishonch hosil qilish uchun. Mashinangizda yoki veb-saytingizni yuklagan uy egasiga hech qachon bir xil Id berilmaydi.

Asp.Net MVC AspNetUsers jadvali uchun noyob identifikatorni yaratish uchun foydalanadigan narsa:

using System;
using System.Runtime.InteropServices;

public class SqlGuidUtil
    {
        [DllImport("rpcrt4.dll", SetLastError = true)]
        static extern int UuidCreateSequential(out Guid guid);

        public static Guid NewSequentialId()
        {
            Guid guid;
            UuidCreateSequential(out guid);
            var s = guid.ToByteArray();
            var t = new byte[16];
            t[3] = s[0];
            t[2] = s[1];
            t[1] = s[2];
            t[0] = s[3];
            t[5] = s[4];
            t[4] = s[5];
            t[7] = s[6];
            t[6] = s[7];
            t[8] = s[8];
            t[9] = s[9];
            t[10] = s[10];
            t[11] = s[11];
            t[12] = s[12];
            t[13] = s[13];
            t[14] = s[14];
            t[15] = s[15];
            return new Guid(t);
        }
    }

Foydalanish:

Guid gid = SqlGuidUtil.NewSequentialId();
String sid = SqlGuidUtil.NewSequentialId().ToString();

Namuna chiqishi:

637E3E78-23F5-E611-8278-506313F91120

Ushbu format AspNet Identity user Id formati bilan bir xil.

Bundan tashqari, quyida keltirilgan chiziqlarni (yaxshi fikr emas) ham olib tashlashingiz mumkin:

String sid = SqlGuidUtil.NewSequentialId().ToString().Replace("-","");
2
qo'shib qo'ydi
Bu chiroyli yondashuv, ammo mag'lubiyatning uzunligi juda uzun. Misol uchun, masalan, 6 uzunligi bilan satrlarga kerak bo'lishi mumkin.
qo'shib qo'ydi muallif Alireza Noori, manba
Ha, uzunligi ustidan nazorat bo'lmasligi mumkin. chunki siz yagona xususiyatni talab qildingiz, bu oyna xususiyati va loopsiz eng tezkor generator. Omad
qo'shib qo'ydi muallif Efe, manba

Biz avvalgi loyihalarimizdan boshqa maqsadga erishishimiz kerak edi. Biz yangi jadvalga bir nechta noyob identifikatorlarni yaratdik (jadval A deb nomlanaylik), so'ngra jadval B ga yangi rekord qo'shmoqchi bo'lsak, biz faqat A belgisidan eng birinchi rekordni tetikda qo'shdik.

1
qo'shib qo'ydi

JB ustunida noyob indeksni qo'ying va JB uni noyob cheklovsiz qabul qilgunga qadar ishlab chiqishni davom eting. To'qnashuvlar juda kam uchraydi.

1
qo'shib qo'ydi

foydalanuvchi kodi kabi

string referenceCode=Guid.NewGuid().ToString();
referenceCode=referenceCode.Replace('-', '');
db.Tickets.Add(new Ticket()
{
   ReferenceCode = referenceCode;
   //...
});
1
qo'shib qo'ydi

Buni ko'ring:

Guid.NewGuid().ToString("N").Substring(0, 10)

SQL jadvallarida C# kodi bazasidan tasodifiy satrlarni yaratish vaqtida foydalanar. Bu C# Guidning tasodifiyligiga asoslangan va har bir yangi alfanumeric Stringni qabul qilasiz.

0
qo'shib qo'ydi

Noyoblik va System.Random sinfini taqdim etish uchun sizning identifikatoringizdan foydalanib, sizga tasodifiylikni kiritish uchun quyidagilarni kutmoqdasiz:

private string GenerateRandomCode(int Key)
{
    Random rnd = new Random(Key);
    char[] values = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToArray();

    string result = string.Empty;
    for(int i = 0; i < 10; i++)
    {
         result += values[rnd.Next(0, values.Length)];
    }

    return result;
}

asosiy qiymati shu hosil kodni ta'minlaydi va tasodifiy sinf Unicity haqida tashvish emas etarli davri bor.

0
qo'shib qo'ydi

Guid dan foydalanib, men yagona simni yaratish funktsiyasini yaratdim. Albatta GUIDlar to'qnashishi mumkin, shuning uchun men yangi Guid bilan o'rtada mag'lubiyatni o'zgartiraman.

     static string GenerateRandomCode(){
        string guid = Guid.NewGuid().ToString("N");     
        List lst = new List();
        int count = 1;

        foreach(char c in guid){                
            if(count==11) break;                
            if(count % 2 ==0){
                lst.Add(Guid.NewGuid().ToString().ToCharArray()[1]);
            }
            else{
                lst.Add(c);
            }
            count++;
        }           
        return string.Join("",lst.ToArray());
    }
0
qo'shib qo'ydi

Buni ko'ring. Bu men uchun ish

var buffer = new byte[5];
new Random().NextBytes(buffer);
Console.WriteLine(string.Join("", buffer.Select(b => b.ToString("X2"))));
0
qo'shib qo'ydi