我需要生成一个唯一的ID,并考虑使用 Guid.NewGuid
来实现,它会生成如下格式的内容:
0fe66778-c4a8-4f93-9bda-366224df6f11
这段文字将存储在字符串类型数据库列中,长度有些长,因此我打算对其进行截断处理。
问题是:在唯一性方面,GUID的某一端是否比其他部分更好? 我应该截取开头、结尾还是删除中间的部分?还是没有关系?
我需要生成一个唯一的ID,并考虑使用 Guid.NewGuid
来实现,它会生成如下格式的内容:
0fe66778-c4a8-4f93-9bda-366224df6f11
这段文字将存储在字符串类型数据库列中,长度有些长,因此我打算对其进行截断处理。
问题是:在唯一性方面,GUID的某一端是否比其他部分更好? 我应该截取开头、结尾还是删除中间的部分?还是没有关系?
您可以使用base64字符串来节省空间:
var g = Guid.NewGuid();
var s = Convert.ToBase64String(g.ToByteArray());
Console.WriteLine(g);
Console.WriteLine(s);
这将节省12个字符(如果您没有使用连字符,则为8个字符)。
来自以上链接:
* Four bits to encode the computer number,
* 56 bits for the timestamp, and
* four bits as a uniquifier.
你可以重新定义 Guid 以适应你的需求。
double numBirthdays = 365; // set to e.g. 18446744073709551616d for 64 bits
double numPeople = 23; // set to the maximum number of GUIDs you intend to store
double probability = 1; // that all birthdays are different
for (int x = 1; x < numPeople; x++)
probability *= (double)(numBirthdays - x) / numBirthdays;
Console.WriteLine("Probability that two people have the same birthday:");
Console.WriteLine((1 - probability).ToString());
01
。newsequentialid()
这样的东西,选择某些位几乎是 0% 的随机 :} - user2864740我同意Rob的观点 - 全部保留。
但是,既然你说要进入数据库,我想指出仅使用Guid并不一定意味着它在数据库中会有良好的索引。因此,NHibernate开发人员创建了一个更适合数据库的Guid.Comb
算法。
有关更多信息,请参见NHibernate POID Generators revealed和Guid Algorithms的文档。
注意: Guid.Comb旨在提高MsSQL的性能。
截断GUID是一个不好的想法,请参考这篇文章了解原因。
您应该考虑生成一个较短的GUID,因为谷歌提供了一些解决方案。这些解决方案似乎涉及将GUID更改为完整的255位ASCII表示。