繁体   English   中英

如何在.net中生成8个字符的文档ID或报告ID

[英]How to generate a document ID or Report ID of 8 characters in .net

有人可以指出我生成报告或文档ID的首选方法吗? 我一直在寻找也许会减少到更短长度的GUID。 我们有一个应用程序,可以为大约8个字符长的报告创建ID。 他们似乎正在使用某种类型的哈希码。 可能使用base 36编码方案。 但是我似乎找不到一种使哈希码长度达到8个字符的方法,因为人们不得不使用它们来引用文档。 它们也将在断开连接的环境中使用,因此您无法在链中查找下一个可用的序列号。 只是想知道你们中有些人在这种应用程序中使用什么?

.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-Uni​​que-Keys-in-Net

这就是我最终使用的。 它是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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    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 = "";
    }

}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM