2013-04-16 25 views
0

有人可以指出生成報告或文檔ID的首選方法嗎?我一直在尋找可能使用的guid,將其縮小到更短的長度。我們有一個應用程序爲大約8個字符的報告創建一個ID。他們似乎使用某種類型的散列碼。可能使用基本的36編碼方案。但是我似乎找不到一種方法讓散列碼長達8個字符,因爲人們必須使用它們來引用文檔。它們也將用於斷開連接的環境,因此您無法查找鏈中下一個可用的序列號。想知道你們中的一些人在這樣的應用程序中使用?如何在.net中生成8個字符的文檔ID或報告ID

回答

1

.net Framwork提供了RNGCryptoServiceProvider類,它使用加密服務提供程序(CSP)提供的實現實現加密隨機數生成器(RNG)。這個類通常用於生成隨機數。雖然我可以使用這個類在某種意義上生成唯一的數字,但它也不是相互衝突較少的。而且,當生成密鑰時,我們可以通過將密鑰設置爲字母數字而不是數字來使密鑰更復雜。所以,我使用這個類和一些字符掩碼來生成固定長度的唯一鍵。

private string GetUniqueKey() 
{ 
int maxSize = 8 ; 
int minSize = 5 ; 
char[] chars = new char[62]; 
    string a; 
    a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
chars = a.ToCharArray(); 
int size = maxSize ; 
    byte[] data = new byte[1]; 
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider(); 
crypto.GetNonZeroBytes(data) ; 
size = maxSize ; 
data = new byte[size]; 
crypto.GetNonZeroBytes(data); 
StringBuilder result = new StringBuilder(size) ; 
foreach(byte b in data) 
{ result.Append(chars[__b % (chars.Length -)>); } 
    <span class="code-keyword">return result.ToString(); 
    } 

http://www.codeproject.com/Articles/14403/Generating-Unique-Keys-in-Net

+0

感謝您的幫助。這對我來說似乎工作得很好。我不得不改變一些圍繞result.append行的代碼,因爲沒有_b變量和「chars.length - 」我刪除了 - 符號。看起來像你在網絡環境中使用它。但它現在對我很好。再次感謝。我不知道衝突會是什麼樣子,但我會嘗試一段時間。 – SDanks

+0

您的歡迎希望它有助於解決您的問題。 – Pamma

0

這是我最終使用。這是一個base36編碼。我借用了其他人的部分代碼,所以我不能說我全部都寫了,但我希望這可以幫助其他人。這將產生大約12位數的記錄ID或數據庫的唯一ID等。它僅使用一年中的最後兩位數字,所以它應該在100年內有效。

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace Base36Converter 
{ 
public partial class Form1 : Form 
{ 
    private const string CharList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    //Base 36 number consists of only numbers and uppercase letters only. 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (textBox2.Text.Length > 0) 
     { 
      label3.Text = ""; 
      //Get Date and Time Stamp 
      string temp1 = GetTimestamp(DateTime.Now); 
      //Turn it into a long number 
      long l = Convert.ToInt64(temp1); 
      //Now encode it as a base36 number. 
      string s1 = Encode(l); 

      //Get userID as a number, i.e. 1055 (User's index number) and create as a long type. 
      long l1 = Convert.ToInt64(textBox2.Text); 
      //Encode it as a base36 number. 
      string s2 = Encode(l1); 


      //Now display it as the encoded user number + datetime encoded number (Concatenated) 
      textBox1.Text = s2 + s1; 
     } 
     else 
     { 
      label3.Text = "User Number must be greater than 0. ie 1055"; 
     } 
    } 

    public static String Encode(long input) 
    { 
     if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative"); 

     char[] clistarr = CharList.ToCharArray(); 
     var result = new Stack<char>(); 
     while (input != 0) 
     { 
      result.Push(clistarr[input % 36]); 
      input /= 36; 
     } 
     return new string(result.ToArray()); 
    } 

    public static String GetTimestamp(DateTime value) 
    { 
     return value.ToString("yyMMddHHmmssffff"); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     label3.Text = ""; 
    } 

} 
} 
+0

使用1055的輸入,它剛剛爲報告ID號生成了TBCUB7IT8TFN。 – SDanks