如何通过电子邮件或用户名

时间:2018-05-28 10:11:47

标签: c# asp.net-mvc c#-4.0

我想在c#中创建一个接受我唯一的电子邮件或用户名的方法,并会像youtube的视频ID(https://www.youtube.com/watch?v=_MSYfOYFF14)一样返回一个唯一的字符串。我不能简单地使用GUID,因为我想为每个用户生成一个唯一的字符串,并且每次我按下该方法时它对于该用户都将保持相同。 无论如何,那可能吗?

3 个答案:

答案 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)参数。