根据键打乱字符串中的字符

本文关键字:字符 字符串 | 更新日期: 2023-09-27 18:23:52

我有以下字符串:

String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

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

  1. 简单地通过对字符进行重新排序而获得的字符串;

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

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

String characters = "jkDEF56789hisGHIbdefpqraXYZ1234txyzABCcglmnoRSTUVWuvwJKLMNOPQ0";

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

String shortList = "8GisIbH9hd";

问题

我可以改为字符数组,然后按Guid随机排序。

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

这有道理吗?

根据键打乱字符串中的字符

您可以将GUID字符串转换为其ascii/utf/的int数组,无论这里的代码是什么获取C#字符串中字符的ASCII值。然后用以下内容迭代这个数组(注意:这是伪代码):

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

对于任务[2],您可以反转您的字符,例如,像这里这样反转字符串的最佳方式并使用c#string函数left()截断它,然后再通过相同的过程

运行它

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

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号种子点,你会得到不同的结果。