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

时间:2013-04-16 15:55:55

标签: guid hashcode hash-code-uniqueness

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是我最终使用的。它是base36编码。我从其他人那里借了部分代码,所以我不能声称我写了这一切,但我希望这能帮助别人。这将产生大约12位数的记录ID,或数据库等的唯一ID。它仅使用年份的最后2位数,因此它应该有效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 = "";
    }

}
}
相关问题