如何在c#

时间:2017-07-27 10:42:42

标签: c# .net c#-4.0

我有以下函数,如果传递任何键/值,它将给我随机字符串。

现在我想要的是,如果我将相同的键/值传递给该函数,那么它将为我提供与之前一样生成的相同字符串。

例如。如果我传递字符串“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());
    }

4 个答案:

答案 0 :(得分:4)

您可以在创建而不是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());
}

您可以看到我使用Random播种key.GetHashCode()。这是从字符串中获取int的快速而又脏的方法。您应该评估它是否适合您使用它的任何目的。

值得一提的是,我认为GetHashCode不能依赖于在不同系统或同一程序的不同执行中给出相同的值。它可能会但不保证所以如果这是一个问题,你会想要将自己的字符串写入int函数。

答案 1 :(得分:1)

您可以缓存已生成的值。

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;
    }
}

警告

正如克里斯在评论中提到的,这不会在多次运行程序之间产生一致的结果。

答案 2 :(得分:1)

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();                
}

答案 3 :(得分:0)

你在哪里声明&#34;随机&#34;变量?

我猜您的随机变量是System.Random类的一个实例。该类有2个构造函数:一个没有参数,另一个带有Int32参数(随机种子值)。如果使用第二个构造函数(设置种子值的构造函数),每次使用相同的种子值时,您将获得相同的随机数序列(因此,相同的RandomString)。

希望有所帮助。