Noe*_*oel 75 .net c# uniqueidentifier
我需要.NET中的唯一标识符(不能使用GUID,因为它对于这种情况来说太长了).
人们认为这里使用的算法是一个很好的候选人还是你有其他建议吗?
Dor*_*hen 77
您可以使用Base64:
string base64Guid = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
Run Code Online (Sandbox Code Playgroud)
这会生成一个像E1HKfn68Pkms5zsZsvKONw ==的字符串.由于GUID始终是128位,因此您可以省略您知道将始终存在的==,这将为您提供22个字符的字符串.这并不像YouTube那么短.
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)
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更小.
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)
据我所知,剥离一部分GUID并不能保证是独一无二的 - 事实上,它并不是独一无二的.
Jeff Atwood在这篇博客文章中介绍了我所知道的保证全球唯一性的最短内容.在链接的帖子中,他讨论了缩短GUID的多种方法,最后通过Ascii85编码将其缩减到20个字节.
但是,如果你绝对需要一个不超过15个字节的解决方案,我恐怕别无选择,只能使用不保证全局唯一的东西.
IDENTITY值在数据库中应该是唯一的,但是您应该意识到其局限性……例如,它使批量数据插入基本上变得不可能,如果您要处理大量记录,它将使您的速度变慢。
您也许还可以使用日期/时间值。我看过几个数据库,它们使用日期/时间作为PK,虽然它不是超级干净的-但它可以工作。如果控制插入,则可以有效地保证值在代码中是唯一的。
对于我的本地应用程序,我使用这种基于时间的方法:
/// <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)
基于其他一些解决方案,这是我的解决方案,它提供了不同的编码 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)
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)