發表文章

目前顯示的是有「亂數」標籤的文章

C# HEX 字串 產生方式 (HEX KEY Gen)

很多時候,需要產生 HEX KEY 來做為唯一值,或是種子密碼來用,一般的情況我們會檢單的使用亂數(Random)來產生 Random rnd = new Random(); int num = rnd.Next(); string hexData = num.ToString("X"); 但是,許多人都知道,如果要產生很長的HEX字串,這個 Ramdom 是不夠力的。 而且也有『不夠亂』的問題存在(受限於Random演算法) 當然如果需要32字元的 HEX 字串,也可以直接使用 GUID 產生方式來獲得: string guidString = Guid.NewGuid().ToString().Replace("-", "").ToUpper(); string hexData = guidString; 但是如果要再更長,夠亂的HEX字串呢? 則可以使用 RNGCryptoServiceProvider 來處理 使用前記得引用 System.Security.Cryptography byte[] bytes = new byte[16]; using (var rng = new RNGCryptoServiceProvider()) {         rng.GetBytes(bytes); } string sBytes = BitConverter.ToString(bytes).Replace("-", ""); string hexData = sBytes; 長度的決定就由 byte 陣列大小來決定,因為一個byte可以生成2個字元的HEX碼, 所以byte[16]可以生成32字元HEX碼,byte[32]可以生成64字元的HEX碼,依此類推。

C# 如何產生不重複的隨機碼

某些情況下,需要產生一系列的亂碼,而且不重複。 下面兩種方式都可以達到效果 下面這個範例是打亂 1 - 9999 數字排序,然後取出前 1000 筆紀錄來使用。 方法一:傻瓜產生法 一般而言會使用迴圈,然後一邊產生亂碼一邊檢查是否重複。 Random rnd = new Random(); List<int> list1 = new List<int>(); do {     int number = rnd.Next(1, 9999);     int dup = list1.IndexOf(number);     if (dup < 0)     {         list1.Add(number);     } } while (list1.Count < 1000); 優點:速度快 缺點:當取號數量等於亂數數量時,可能會變成迴圈永遠不會結束(因為最後一碼超難取到)。 方法二:洗牌法 下面使用一種亂數排序方式,將一系列數字打亂其順序,然後再取出要使用的數字範圍,就可以很快的得到我們要的亂數範圍。 Random rnd = new Random(); List<int> randomList = Enumerable.Range(1, 9999)     .OrderBy(x => rnd.Next()).Take(1000).ToList(); 優點:直覺取號,當取號數量等於亂數數量時保證可取。 缺點:耗時稍多(其實頂多比方法一多十幾毫秒而已)。 夠簡單吧!