我有以下函数,如果传递任何键/值,它将给我随机字符串。
现在我想要的是,如果我将相同的键/值传递给该函数,那么它将为我提供与之前一样生成的相同字符串。
例如。如果我传递字符串“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());
}
答案 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)。
希望有所帮助。