我想在c#中创建一个接受我唯一的电子邮件或用户名的方法,并会像youtube的视频ID(https://www.youtube.com/watch?v=_MSYfOYFF14)一样返回一个唯一的字符串。我不能简单地使用GUID,因为我想为每个用户生成一个唯一的字符串,并且每次我按下该方法时它对于该用户都将保持相同。 无论如何,那可能吗?
答案 0 :(得分:0)
如果它不会暴露给其他人,那么它可以是人类可读的。说明用户名或密码是唯一的,这意味着这些值与某些字符(不能在电子邮件和用户名中使用)连接的组合也必须是唯一的。结果非常简单:
var uniqueString = $"{uniqueName}|{uniqueEmail}";
答案 1 :(得分:0)
1)使用MD5获取字节数组
2)将字节数组转换为字符串
3)删除最后两个字符
using System.Security.Cryptography;
//...
private string GenerateUniqueString(string input )
{
using (MD5 md5 = MD5.Create())
{
byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(input));
var res = Convert.ToBase64String(hash);
return res.Substring(0, res.Length - 2);
}
}
答案 2 :(得分:0)
将多个字符串散列在一起的简单示例。
public static string Hash(bool caseInsensitive, params string[] strs)
{
using (var sha256 = SHA256.Create())
{
for (int i = 0; i < strs.Length; i++)
{
string str = caseInsensitive ? strs[i].ToUpperInvariant() : strs[i];
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] length = BitConverter.GetBytes(bytes.Length);
sha256.TransformBlock(length, 0, length.Length, length, 0);
sha256.TransformBlock(bytes, 0, bytes.Length, bytes, 0);
}
sha256.TransformFinalBlock(new byte[0], 0, 0);
var hash = sha256.Hash;
return Convert.ToBase64String(hash);
}
}
有一个caseInsensitive
参数,因为foo@bar.com
相当于foo@BAR.COM
(通常FOO@bar.com
相当于所有这些参数)。请注意我对字符串的编码方式:我在每个字符串之前添加编码字符串的长度(以UTF8格式)。这样"Hello", "World"
与"Hello World"
不同,因为其中一个将转换为类似于5Hello5World
的内容,而另一个将转换为"11Hello World"
。
Usange:
string base64hash = Hash(true, "Donald Duck", "donaldduck@disney.com");
请注意,由于params
关键字,Hash
方法可以接受任意数量的(string
)参数。