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

===============>>#1 票数: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-Uni​​que-Keys-in-Net

===============>>#2 票数: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 = "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 = "";
    }

}
}

  ask by SDanks translate from so

未解决问题?本站智能推荐:

6回复

在字符串上调用GetHashCode()时获取重复值的概率

我想知道在string实例上调用GetHashCode()方法时获取重复值的可能性。 例如, 根据本博客文章, blair和brainlessness具有x86机器上相同的hashCode(1758039503)。
5回复

如何从三个long中生成哈希码

我有一个以坐标为键的HashMap。 坐标有3个long,分别容纳x,y和z坐标。 (坐标是并且需要是一个自定义类,坐标必须是longs)。 现在,我希望能够通过执行以下hashMap.get(new Coordinate(5, 10, 4))来访问例如字段[ hashMap.ge
2回复

生成更大的HashCode JAVA

由于已知事实,Java会生成大约40亿个唯一的Hashcode。 我正在使用某些字符串的哈希码(例如Fname + Lname + DOB + DATE),它成为数据库的主键 在@PrePersist中,我使用Hashcode进行了设置,这有助于我为新用户生成Hashcode。 (
1回复

可以为同一double的GetHashCode()生成不同的整数吗?

假设我们在C#中有一个double值。 GetHashCode()是否有可能在不同的计算机/窗口/体系结构上为此double返回不同的整数值?
1回复

字符串GUID的哈希码是奇数还是偶数的概率是多少?

GUID是一个23个字符的字符串,在JVM,机器,线程,进程等中是唯一的。其哈希码是根据Java字符串哈希码定义计算的: http : //docs.oracle.com/javase/1.4.2/ docs / api / java / lang / String.html#hashCode%
1回复

CRC-32哈希的唯一性是否足以唯一地标识包含文件名的字符串?

我已经将连接到字符串的文件名列表排序,并希望通过唯一的校验和来标识每个这样的字符串。 这些字符串的大小至少为100个字节,最多为4000个字节,平均为1000个字节。 字符串的总数可以是任何值,但更可能是在ca.的范围内。 10000。 CRC-32适用于此目的吗? 例如,
14回复

为什么此函数生成的哈希码不是唯一的?

我正在测试下面从Google搜索获得的VB函数。 我计划使用它来生成哈希码,以便进行快速字符串比较。 但是,在某些情况下,两个不同的字符串具有相同的哈希码。 例如,这些字符串 “ 122Gen 1堆大小(.NET CLR内存w3wp):mccsmtpteweb025.20833333
2回复

如何在scrapy图像下载中处理图像文件名重复

Scrapy使用sha1生成随机图像文件名。 发生复制时,它将覆盖文件,从而导致现有映像文件丢失。 是否可以编写额外的代码(例如:覆盖类)来处理重复。 例如:继续生成新的随机文件名,直到找不到重复文件? 如果是,请提供代码示例? ---旧问题:是否检查以确保images_store
2回复

.Net C#String.GetHashCode()替代方案

比较很多字符串数据(csv文件)时遇到问题。 这些文件具有唯一ID但未排序且非常大。 所以我尝试创建两个字典,其中key是来自file的uniqueID,而Value是int,它返回我感兴趣的字符串的GetHashCode()以进行更改。 但是,简短的例子: 那么有没有其他
5回复

这是生成哈希码的好方法吗?

我必须在以下两个条件下编写一个哈希函数: 我对传递给方法的Object o一无所知 - 它可以是String,Integer,也可以是实际的自定义对象; 我根本不允许调用hashCode() 。 我现在使用的方法,计算哈希码: 将对象写入字节流; 将字