C# 是否有任何方法可以生成一个与UUID(GUID)长度不同的唯一编号?

C# 是否有任何方法可以生成一个与UUID(GUID)长度不同的唯一编号?,c#,uniqueidentifier,C#,Uniqueidentifier,可能重复: 基本上我需要生成一个唯一的数字,但我不希望它太长,比如UUID。一半大小的东西(如果不是更小的话) 有人能想出什么办法来做到这一点吗 基本上,我将有一个应用程序,可能被多人使用,该应用程序生成文件并上传到web服务器。这些名称必须是唯一的 顺便说一句,我不想用数据库表来跟踪这些东西 生成一个UUID,只获取字符串的前半部分 如果您担心生成重复的ID,您可以选择使其非随机且自动递增,或者检查是否存在新生成的ID: do { newId = generateNewId(); } w

可能重复:

基本上我需要生成一个唯一的数字,但我不希望它太长,比如UUID。一半大小的东西(如果不是更小的话)

有人能想出什么办法来做到这一点吗

基本上,我将有一个应用程序,可能被多人使用,该应用程序生成文件并上传到web服务器。这些名称必须是唯一的


顺便说一句,我不想用数据库表来跟踪这些东西

生成一个UUID,只获取字符串的前半部分

如果您担心生成重复的ID,您可以选择使其非随机且自动递增,或者检查是否存在新生成的ID:

do {
  newId = generateNewId();
} while (idExists(newId));

如果您需要独特且简短的url,请使用UUID并使用url缩短器。

激起了我的好奇心:

// create a 32-bit uid:
    var i = BitConverter.ToUInt32(Guid.NewGuid().ToByteArray(), (new Random()).Next(0, 12));
// create a 64-bit uid
    var l = BitConverter.ToUInt64(Guid.NewGuid().ToByteArray(), (new Random()).Next(0, 8));
当然,以下内容也同样适用,因为截断guid时会丢失它的大部分功能,还不如使用随机数:

l = BitConverter.ToUInt64(BitConverter.GetBytes((new Random()).NextDouble()), 0);

。。。如果要查找64位整数

什么语言?什么操作系统?这是一个非常通用的系统,除了把它当作成千上万个“我如何生成一个随机数?”问题的复制品来关闭外,没有任何合理的答案。仅仅接受
n
随机数是行不通的?对于每个有权上传内容的用户,是否都有类似的用户id?经典的filename.ext、filename(1.ext、filename(2.ext)不是可以避免重复的名称吗?您需要首先检查文件是否存在,我不清楚您是否能够这样做。您是说UUID的同半个字符串中不可能有2个?当然可以。反对它的几率是天文数字,尽管你最好还是生成一个完整的UUID。如果您不相信随机性是均匀分布的,请每隔一个完整UUID的字母取一个,或者只生成您自己的随机字符串。有成千上万个这样做的例子。旁注:由于鸽子洞原理,没有办法使任何有限值唯一。UUID生成算法保证(尽可能)整个值的唯一性,并包含基于不同自助餐厅生成的部分(时间/随机值,…)-因此,与第一部分不同,最好是对UUID的部分进行散列/XOR运算,以获得良好的随机数。@64位UUID发生冲突的可能性是128位UUID的2^64倍。远远超过“两倍的可能性”。这就像说“百分之一的几率是十万分之一的一半”一样;将位数减半不会使这些位数的可能组合数减半。127位UUID产生冲突的可能性是128位UUID的两倍。好了,我将使用半个UUID,然后从这里开始。我将把这个文件上传到web服务。因此,如果“冲突”两个项目具有相同的名称,我将简单地重新排列字母/数字以使其唯一。(或在末尾添加字母或数字)。我永远不会遇到这个问题,但我会解决的。如果需要,有一个检查人员在那里进行检查。