从给定的字符串生成可重现的 "Gibberish"
Generate Reproducible "Gibberish" from a given String
我正在寻找类似于散列算法的东西,除了我希望它在给定任意字符串的情况下生成一个预定义长度的数组。例如:
任意种子:
"Entropy"
所需长度:
种子中的 100 个可复制字符。
可能的输出: EfvrlL9uGKolblPScba2ziPPON5QEm2Q0fsEPMURqu2NSVSXwaqkgCbjm0naeuoaATGWApJ1afBT3HxaWnoNuXCKSBY7EwCpTOga
生成的输出 不是 以任何方式需要加密安全并且生成的字符无关紧要(它们可以是任何东西甚至不可打印的字符)。我唯一的要求是在给定相同种子的情况下,输出可以完全重现。有人对我如何实现这一目标有任何建议吗?
我决定使用我自己的伪哈希,效果很好。这是我想出的代码;希望它能在将来帮助其他人:
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);
我正在寻找类似于散列算法的东西,除了我希望它在给定任意字符串的情况下生成一个预定义长度的数组。例如:
任意种子: "Entropy"
所需长度: 种子中的 100 个可复制字符。
可能的输出: EfvrlL9uGKolblPScba2ziPPON5QEm2Q0fsEPMURqu2NSVSXwaqkgCbjm0naeuoaATGWApJ1afBT3HxaWnoNuXCKSBY7EwCpTOga
生成的输出 不是 以任何方式需要加密安全并且生成的字符无关紧要(它们可以是任何东西甚至不可打印的字符)。我唯一的要求是在给定相同种子的情况下,输出可以完全重现。有人对我如何实现这一目标有任何建议吗?
我决定使用我自己的伪哈希,效果很好。这是我想出的代码;希望它能在将来帮助其他人:
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);