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