[英]How to generate unique 12 digit alphanumeric key for use in URL
有沒有一種方法可以生成在C#中的URL中使用的唯一字母數字鍵(12位數字)? 我有一組彼此唯一的字符串,但是由於它們可能會更改,因此無法直接使用它們,因此URL會中斷。 我有幾種方法-
a)使用數據庫表本身的主鍵,該主鍵與具有上述字符串集的行相對應,但這似乎是一個安全問題,因為它將暴露db結構。
b)使用Guid,但是同樣它不依賴於數據。
任何幫助將不勝感激。
簡短的回答:不 。
您嘗試的是不可能的。 您必須跟蹤已經創建的ID 。 這就是數據庫對遞增的索引列所做的事情。 我也了解URL縮短工具從一組生成的唯一密鑰中獲取新密鑰 。
綜上所述 , 像DotNetFiddle這樣的東西可能會起作用 ,而其他一些答案也可能會起作用 。
在小提琴中,我們在第一個示例中對主鍵進行哈希處理。 由於僅完整的散列在計算上不可能對每個輸入不是唯一的,並且由於我們使用的是散列的子字符串,因此無法保證唯一性,但它可能很接近。
這是MSDN關於哈希唯一性的內容。
密碼散列函數具有以下特性:找到兩個散列為相同值的不同輸入在計算上是不可行的。
在第二個示例中,我們使用時間,據我所知,遞增時間被保證是唯一的,因此,如果您可以依靠時間是准確的,那么這將起作用。 但是,如果您要依賴服務器時間之類的外部資源,那么也許您應該在數據庫表或簡單的平面文件中使用自動遞增索引。
using System;
using System.Text;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
UseAHash();
UseTime();
}
public static void UseAHash()
{
var primaryKey = 123345;
HashAlgorithm algorithm = SHA1.Create();
var hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(primaryKey.ToString()));
StringBuilder sb = new StringBuilder();
for (var i = 0; i < 6; ++i)
{
sb.Append(hash[i].ToString("X2"));
}
Console.WriteLine(sb);
}
public static void UseTime()
{
StringBuilder builder = new StringBuilder();
// use universal to avoid daylight to standard time change.
var now = DateTime.Now.ToUniversalTime();
builder.Append(now.DayOfYear.ToString("D3"));
builder.Append(now.Hour.ToString("D2"));
builder.Append(now.Minute.ToString("D2"));
builder.Append(now.Second.ToString("D2"));
builder.Append(now.Millisecond.ToString("D3"));
Console.WriteLine("Length: " + builder.Length);
Console.WriteLine("Result: " + builder);
}
}
您可以使用數據庫中的密鑰為隨機生成器添加種子,然后使用該密鑰來創建密鑰:
int id = 42;
string chars = "2345679abcdefghjkmnpqrstuvwxyz";
Random rnd = new Random(id);
string key = new String(Enumerable.Range(0, 12).Select(n => chars[rnd.Next(chars.Length)]).ToArray());
注意:這不能保證是唯一的。 我測試了從1到10000000的值,並且那里沒有重復項。
簡單。 創建一個新的GUID,從數據庫中為其分配一個實體,然后將其添加到數據庫表中。
public class FooGuid
{
[Key] public Guid Url { get; set; }
public Foo Foo { get; set; }
}
Guid urlpart = ...
Foo foo = dbContext.FooGuids
.Where(f => f.Url == urlpart)
.Select(f => f.Foo)
.Single();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.