.NET短唯一标识符

Noe*_*oel 75 .net c# uniqueidentifier

我需要.NET中的唯一标识符(不能使用GUID,因为它对于这种情况来说太长了).

人们认为这里使用的算法是一个很好的候选人还是你有其他建议吗?

Dor*_*hen 77

这个很好 - http://www.singular.co.nz/blog/archive/2007/12/20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx

还有 像YouTube一样的GUID

您可以使用Base64:

string base64Guid = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
Run Code Online (Sandbox Code Playgroud)

这会生成一个像E1HKfn68Pkms5zsZsvKONw ==的字符串.由于GUID始终是128位,因此您可以省略您知道将始终存在的==,这将为您提供22个字符的字符串.这并不像YouTube那么短.

  • 简短说明:如果URL需要这个,那么使用它的人可能也想要清理'+'和'/'字符 (8认同)
  • [madskristensen的博客](https://madskristensen.net/blog/A-shorter-and-URL-friendly-GUID) (2认同)
  • 我想要 Unity 中 UnnyNet 的最大 23 个字符长的唯一 id,但我被我的又大又笨的 GUID 困住了,你让我很高兴:) (2认同)

Jai*_*ime 29

我使用与Dor Cohen类似的方法,但删除了一些特殊字符:

var uid = Regex.Replace(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), "[/+=]", "");     
Run Code Online (Sandbox Code Playgroud)

这将只输出字母数字字符.UID不保证总是具有相同的长度.这是一个示例运行:

vmKo0zws8k28fR4V4Hgmw 
TKbhS0G2V0KqtpHOU8e6Ug 
rfDi1RdO0aQHTosh9dVvw
3jhCD75fUWjQek8XRmMg 
CQUg1lXIXkWG8KDFy7z6Ow 
bvyxW5aj10OmKA5KMhppw
pIMK8eq5kyvLK67xtsIDg
VX4oljGWpkSQGR2OvGoOQ 
NOHBjUUHv06yIc7EvotRg
iMniAuUG9kiGLwBtBQByfg
Run Code Online (Sandbox Code Playgroud)

  • 您将丢弃GUID保证的一些属性,丢弃这样的信息.我建议用不同的字符替换你不熟悉的字符,同时保留GUID和它们的序列化格式之间的双射. (4认同)
  • 如果您不想转换回 GUID 而只需要其他东西的随机字符,这是一个很好的使用方法。例如,跟踪多线程中的工作人员,或线程对象的日志前缀等。 (3认同)

ade*_*l41 20

var ticks = new DateTime(2016,1,1).Ticks;
var ans = DateTime.Now.Ticks - ticks;
var uniqueId = ans.ToString("x");
Run Code Online (Sandbox Code Playgroud)

保持基准日期(在本例中为2016年1月1日),从您开始生成这些ID开始.这将使您的ID更小.

  • 几乎同时生成 ids 没有什么好处,就像在 for-loop.eg https://dotnetfiddle.net/L3MIgZ (11认同)
  • oneliner: var uniqueId = (DateTime.Now.Ticks - new DateTime(2016, 1, 1).Ticks).ToString("x"); (2认同)

Boz*_*Joe 14

简单实用的包装.我将它用于临时请求id生成器.

https://www.nuget.org/packages/shortid

https://github.com/bolorundurowb/shortid

用途 System.Random

string id = ShortId.Generate();
// id = KXTR_VzGVUoOY
Run Code Online (Sandbox Code Playgroud)

(来自github页面)

如果要通过指定是否需要数字,特殊字符和长度来控制生成的id类型,请调用Generate方法并传递三个参数,第一个是布尔表示是否需要数字,第二个布尔表示是否需要数字特殊字符,最后一个数字表示您的长度偏好.

string id = ShortId.Generate(true, false, 12);
// id = VvoCDPazES_w
Run Code Online (Sandbox Code Playgroud)


小智 11

以防万一,仅仅删除连字符对任何人都适用:

Guid.NewGuid().ToString("n")
Run Code Online (Sandbox Code Playgroud)

这会生成完全唯一的 32 个字符的字符串:

5db4cee3bfd8436395d37fca2d48d5b3
82fac271c76148a3a0667c00a5da990d
Run Code Online (Sandbox Code Playgroud)


Chr*_*cht 9

据我所知,剥离一部分GUID并不能保证是独一无二的 - 事实上,它并不是独一无二的.

Jeff Atwood这篇博客文章中介绍了我所知道的保证全球唯一性的最短内容.在链接的帖子中,他讨论了缩短GUID的多种方法,最后通过Ascii85编码将其缩减到20个字节.

但是,如果你绝对需要一个不超过15个字节的解决方案,我恐怕别无选择,只能使用不保证全局唯一的东西.


Dav*_*vid 6

IDENTITY值在数据库中应该是唯一的,但是您应该意识到其局限性……例如,它使批量数据插入基本上变得不可能,如果您要处理大量记录,它将使您的速度变慢。

您也许还可以使用日期/时间值。我看过几个数据库,它们使用日期/时间作为PK,虽然它不是超级干净的-但它可以工作。如果控制插入,则可以有效地保证值在代码中是唯一的。


Pol*_*zer 6

对于我的本地应用程序,我使用这种基于时间的方法:

/// <summary>
/// Returns all ticks, milliseconds or seconds since 1970.
/// 
/// 1 tick = 100 nanoseconds
/// 
/// Samples:
/// 
/// Return unit     value decimal           length      value hex       length
/// --------------------------------------------------------------------------
/// ticks           14094017407993061       17          3212786FA068F0  14
/// milliseconds    1409397614940           13          148271D0BC5     11
/// seconds         1409397492              10          5401D2AE        8
///
/// </summary>
public static string TickIdGet(bool getSecondsNotTicks, bool getMillisecondsNotTicks, bool getHexValue)
{
    string id = string.Empty;

    DateTime historicalDate = new DateTime(1970, 1, 1, 0, 0, 0);

    if (getSecondsNotTicks || getMillisecondsNotTicks)
    {
        TimeSpan spanTillNow = DateTime.UtcNow.Subtract(historicalDate);

        if (getSecondsNotTicks)
            id = String.Format("{0:0}", spanTillNow.TotalSeconds);
        else
            id = String.Format("{0:0}", spanTillNow.TotalMilliseconds);
    }
    else
    {
        long ticksTillNow = DateTime.UtcNow.Ticks - historicalDate.Ticks;
        id = ticksTillNow.ToString();
    }

    if (getHexValue)
        id = long.Parse(id).ToString("X");

    return id;
}
Run Code Online (Sandbox Code Playgroud)


Roe*_*mer 5

基于其他一些解决方案,这是我的解决方案,它提供了不同的编码 guid,它是 URL(和 Docker)安全的并且不会丢失任何信息:

Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace("=", "").Replace("+", "-").Replace("/", "_");
Run Code Online (Sandbox Code Playgroud)

示例输出为:

BcfttHA780qMdHSxSBoZFA
_4p5srPgOE2f25T_UnoGLw
H9xR_zdfm0y-zYjdR3NOig
Run Code Online (Sandbox Code Playgroud)


Did*_*xis 5

22 个字符,url 安全,并保留 Guid 唯一性。

// Our url safe, base 64 alphabet:
const string alphabet = "-_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Sanitized Guid string. Preserve the last two hex chars
var guidStr = "929F7C4D4B2644E1A122A379C02D6345";
var lastTwo = guidStr.Substring(30, 2);

string shortGuid = "";

// Iterate over the ten groups of 3 hex chars: 929 F7C 4D4 B26 44E 1A1 22A 379 C02 D63
for (var i = 0; i < 10; i++)
{
    var hex = guidStr.Substring(i*3, 3);              // Get the next 3 hex chars
    var x = Convert.ToInt32(hex, 16);                 // Convert to int
    shortGuid += $"{alphabet[x/64]}{alphabet[x%64]}"; // Lookup the two-digit base64 value
}
shortGuid += lastTwo; // Don't forget the last two

Console.WriteLine(shortGuid);
Run Code Online (Sandbox Code Playgroud)

输出:

yDXWhiGAfc4v6EbTK0Px45
Run Code Online (Sandbox Code Playgroud)

  • 我的目的是提供一个显示算法的解决方案。显然,有一些方法可以减少代码行数。但了解某件事是如何运作的总是好的。该解决方案可以轻松移植到任何其他语言。 (2认同)