根据键打乱字符串中的字符
本文关键字:字符 字符串 | 更新日期: 2023-09-27 18:23:52
我有以下字符串:
String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
我需要从中创建两个字符串:
简单地通过对字符进行重新排序而获得的字符串;
通过选择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号种子点,你会得到不同的结果。