簡體   English   中英

如何生成由c#中的先前隨機生成的相同密鑰

[英]How to Generate Same key that is Generated by Previously Random in c#

我有下面的函數,如果將任何鍵/值傳遞給它,它將給我隨機字符串。

現在,我想喜歡的是,如果我向該函數傳遞相同的鍵/值,那么它將像以前一樣為我提供相同的字符串。

例如。 如果我傳遞字符串“ iv3mw”,則它將返回輸出,即“ 3vmiw”。 現在我想要這樣,如果我再次傳遞相同的字符串“ iv3mw”,那么我希望像以前一樣輸出相同的輸出,即“ 3vmiw”

請建議我該怎么辦。 下面是我的代碼

 public string RandomString(string key = "")
    {
        string input = "";
        if (key.Trim() == "")
        {
            input = "abcdefghijklmnopqrstuvwxyz0123456789";
        }
        else
        {
            input = key;
        }
        var chars = Enumerable.Range(0, 5)
                               .Select(x => input[random.Next(0, input.Length)]);
        return new string(chars.ToArray());
    }

您可以在創建而不是Random時傳遞種子。 相同的種子將始終生成相同的隨機數序列。 種子是數字,因此您需要一種從字符串到數字的方法。 這是一個工作實現:

public string RandomString(string key = "")
{
    var random = new Random(key.GetHashCode());
    string input = "";
    if (key.Trim() == "")
    {
        input = "abcdefghijklmnopqrstuvwxyz0123456789";
    }
    else
    {
        input = key;
    }
    var chars = Enumerable.Range(0, 5)
                           .Select(x => input[random.Next(0, input.Length)]);
    return new string(chars.ToArray());
}

您可以看到我已經使用key.GetHashCode()植入了Random 這是從字符串獲取int的快速而骯臟的方法。 您應該評估它是否適合用於此目的。

值得一提的是,我相信不能依靠GetHashCode在不同的系統或同一程序的不同執行上提供相同的值。 可能會但不能保證,因此如果出現問題,您需要將自己的字符串寫入int函數。

您可以緩存已經生成的值。

Dictionary<string, string> cache = new Dictionary<string, string>

public string RandomString(string key = "")
{
    string input = "";
    if (key.Trim() == "")
    {
        input = "abcdefghijklmnopqrstuvwxyz0123456789";
    }
    else
    {
        input = key;
    }

    if (cache.ContainsKey(input))
    {
        return cache[input];
    }
    else
    {
        var chars = Enumerable.Range(0, 5)                               
            .Select(x => input[random.Next(0, input.Length)]);
        var value = chars.ToArray();
        cache[input] = value;
        return value;
    }
}

警告

正如克里斯在評論中提到的那樣,這將在程序的多次運行之間產生不一致的結果。

MD5哈希為相同的輸入產生相同的輸出,因此確保了一致性。

一個簡單的例子

using System.Security.Cryptography;
using (MD5 md5Hash = MD5.Create())
{
        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(source));
        StringBuilder sBuilder = new StringBuilder();

        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        return sBuilder.ToString();                
}

您在哪里聲明“隨機”變量?

我猜你的隨機變量是System.Random類的實例。 該類有2個構造函數:一個沒有參數,另一個帶有Int32參數(隨機種子值)。 如果使用第二個構造函數(在其中設置種子值的構造函數),則每次使用相同的種子值時,您將獲得相同的隨機數序列(因此,具有相同的RandomString)。

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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