生成可重复的“乱码”;从一个给定的字符串
本文关键字:一个 字符串 乱码 | 更新日期: 2023-09-27 18:02:26
我正在寻找的东西,有点像一个散列算法,除了我希望它生成一个数组的预定义长度给定任何任意字符串。例如:
任意种子:"熵"
所需长度:100个来自种子的可复制性状。
可能输出: efvrll9ugkolblpscba2zippon5qem2q0fsepmurqu2nssvsxwaqkgcbjm0naeuoaatgwapj1afbt3hxawnonuxcksby7ewcptoga
生成的输出不在任何情况下都需要加密安全,生成的字符无关紧要(它们可以是任何字符,甚至是不可打印的字符)。我唯一的要求是,在相同的种子下,输出是完全可复制的。有谁能给我一些建议吗?
我决定使用我自己的伪哈希,它工作得很好。这是我想出的代码;希望它能在未来帮助到其他人:
public static byte[] HashString(string seed, int length)
{
char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray();
byte[] hash = new byte[length];
byte lastHash = 0;
for (int i = 0; i < length; i++)
{
hash[i] = (byte)alphabet[(seed[(i % seed.Length)] ^ (i + lastHash)) % alphabet.Length];
lastHash = hash[i];
}
return hash;
}
这是一种无需创建自己的散列的方法:
var myString = "Entropy";
byte[] saltBytes = Encoding.ASCII.GetBytes("someSaltIWant");
var dBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(myString, saltBytes).GetBytes(75);
var gibString = Convert.ToBase64String(dBytes);
Console.WriteLine(gibString);
// Always prints MVqAYJbmkxgQ4FdTD+a7/BlfZZLBVDXpsAAYtMuJ4aU5iejD+sB3tHqgSRoCg2KD1vnpI5eXhZa6vWvpOuM8dH8aOi1/zKMXuu4a
即使你对安全性不感兴趣,我认为使用这种散列可以更容易地达到你想要的100个字符。使用MD5或任何SHA,您将简短。
如果你想要一个不可打印的字符串,你可以这样做:
var dBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(myString, strBytes).GetBytes(100);
string ugly = Encoding.ASCII.GetString(dBytes);