Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GUID的哪一部分最值得保留?_C#_Guid_Identifier - Fatal编程技术网

C# GUID的哪一部分最值得保留?

C# GUID的哪一部分最值得保留?,c#,guid,identifier,C#,Guid,Identifier,我需要生成一个唯一的ID,并考虑使用Guid.NewGuid来执行此操作,这将生成以下形式的内容: 0fe66778-c4a8-4f93-9bda-366224df6f11 对于它最终将驻留的字符串类型数据库列来说,这有点长,所以我计划截断它 问题是:就唯一性而言,GUID的一端是否比其他一端更可取?我应该剪掉开头、结尾还是从中间去掉部分?还是这无关紧要? 从以上链接: 您可以重新定义Guid,使其大小适合您的需要。截断Guid是个坏主意,请查看原因 你应该考虑生成一个较短的GUID。这些解决

我需要生成一个唯一的ID,并考虑使用
Guid.NewGuid
来执行此操作,这将生成以下形式的内容:

0fe66778-c4a8-4f93-9bda-366224df6f11
对于它最终将驻留的字符串类型数据库列来说,这有点长,所以我计划截断它

问题是:就唯一性而言,GUID的一端是否比其他一端更可取?我应该剪掉开头、结尾还是从中间去掉部分?还是这无关紧要?

从以上链接:


您可以重新定义Guid,使其大小适合您的需要。

截断Guid是个坏主意,请查看原因


你应该考虑生成一个较短的GUID。这些解决方案似乎涉及获取GUID并将其更改为以完整的255位ascii表示。

您可以通过使用base64字符串来节省空间:

var g = Guid.NewGuid();
var s = Convert.ToBase64String(g.ToByteArray());

Console.WriteLine(g);
Console.WriteLine(s);

这将为您节省12个字符(如果您没有使用连字符,则为8个)。

我同意Rob-保留所有字符

但既然你说你要进入一个数据库,我想我要指出的是,仅仅使用Guid并不一定意味着它会在数据库中很好地索引。出于这个原因,NHibernate开发人员创建了一个更加友好的
Guid.Comb
算法

有关详细信息,请参阅和上的文档


注意:Guid.Comb设计用于提高MsSQL上的性能

如果Guid只是一个随机数,则可以保留位的任意子集,并承受一定百分比的冲突概率,您可以使用“”:

double numbirthdies=365;//将64位设置为例如18446744073709551616d
双numpople=23;//设置为要存储的最大GUID数
双概率=1;//所有的生日都不一样
对于(int x=1;x
然而,冲突的概率通常更高,因为事实上,guid通常不是随机的。据介绍,有五种类型的guid。第13位指定了您使用的GUID类型,因此变化不大,第17位的前两位始终固定在
01

对于每种类型的GUID,您将获得不同程度的随机性。第4版(第13位=4)除第13位和第17位外完全是随机的;版本3和5实际上是随机的,因为它们是加密散列;虽然版本1和版本2大多不是随机的,但某些部分在实际情况下是相当随机的。版本1和版本2的guid的一个“问题”是,许多guid可能来自同一台机器,在这种情况下,将有大量相同的位(特别是,最后48位和许多时间位将是相同的)。或者,如果在不同的机器上同时创建多个guid,则时间位之间可能会发生冲突。所以,祝你好运安全地截断它

我的软件只支持64位的唯一ID,所以我不能直接使用GUID。幸运的是,所有的guid都是类型4,所以我可以得到64位随机或几乎随机的guid。我有200万条记录要存储,生日算法表明64位的冲突概率为1.08420141198273 x 10^-07,48位的冲突概率为0.007(0.7%)。这应该被认为是最好的情况,因为随机性的降低通常会增加碰撞的概率


我认为在理论上,未来可能会存在比现在定义的更多的GUID类型,因此不可能有一个未来验证的截断算法。

这是一个好问题。我倾向于使用中间位,但我不认为有什么区别。我将运行蒙特卡罗实验并公布结果。版本4 UUID的形式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxx-xxxxxxxx,x有任何十六进制数字,但y只有8、9、a或B中的一个。e、 g.f47ac10b-58cc-4372-a567-0e02b2c3d479。如果你不可能全部保留(你真的应该保留!),考虑GUID的128位值,并将其重新编码为更紧凑的,您可以压缩到较短的字符串字段中。我不希望它是全局唯一的-只在我有限的数据库列的约束中合理地唯一,并且只在短期内(为了我的应用的目的)。我很欣赏这个证明。我以前见过这个算法,但从未考虑过这样使用它。谢谢你的教训。不同意。。。由于Guid不是统一的随机位。。。它由计算机、时间和索引器识别。因此,在同一台机器上,tere将是一组静态位。此外,对于类似
newsequentialid()
,选择某些位几乎是0%随机:}包含的信息与版本4 UUID无关。可能有理由保留整个GUID,但这实际上是一个简单的链接-即使它是一个很好的阅读,相关(和准确)的信息也应该出现在答案中。
var g = Guid.NewGuid();
var s = Convert.ToBase64String(g.ToByteArray());

Console.WriteLine(g);
Console.WriteLine(s);
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());