基于键的字符串随机字符

时间:2014-09-21 14:05:51

标签: c#

我有以下字符串:

String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

我需要从中创建两个字符串:

  1. 只需重新排序字符即可获得的字符串;

  2. 通过选择10个字符并重新排序来获得的字符串。

  3. 因此对于(1)我会得到,例如:

    String characters = "jkDEF56789hisGHIbdefpqraXYZ1234txyzABCcglmnoRSTUVWuvwJKLMNOPQ0";
    

    对于(2)我会得到,例如:

    String shortList = "8GisIbH9hd";
    

    问题

    我可以改为Char Array并由Guid随机订购。

    但是我想指定某种键(可能是guid?),对于该键,结果或重新排序以及选择shortList必须相同。

    这有意义吗?

2 个答案:

答案 0 :(得分:0)

您可以将GUID字符串转换为其ascii / utf /此处的任何代码的int数组 Getting The ASCII Value of a character in a C# string。 然后沿着这一行迭代这个数组(注意:这是伪代码):

 string res="";
 for(elem in intconvertedGUIDstring) res+= characters[elem%(characters.count)];

对于任务[2]你可以反转你的角色,就像在这里Best way to reverse a string 并在通过相同的过程

运行之前使用c#字符串函数left()来截断它

答案 1 :(得分:0)

您可以使用具有良好分布值的哈希函数作为元素之间进行比较的种子。这是一个示例:

static ulong GetHash(char value, ulong seed)
{
   ulong hash = seed * 3074457345618258791ul;
   hash += value;
   hash *= 3074457345618258799ul;
   return hash;
}

并使用此功能进行比较:

static void Main()
{
   var seed = 53ul;
   var str = "ABCDEFHYUXASPOIMNJH";
   var shuffledStr = new string(str.OrderBy(x => GetHash(x, seed)).ToArray());
   Console.WriteLine(shuffledStr);
}

现在每次按种子53排序,你都会得到相同的结果,如果你按54种子,你会得到不同的结果。