簡體   English   中英

如何生成唯一的12位字母數字密鑰以在URL中使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM