我的同事和我正在讨论这些方法中的哪一种用于自动生成用户 ID 和发布 ID 以在数据库中进行识别:
一个选项使用 Random 的单个实例,并采用一些有用的参数,因此它可以用于各种字符串生成情况(即从 4 位数字引脚到 20 位字母数字 ID)。这是代码:
// This is created once for the lifetime of the server instance
class RandomStringGenerator
{
public const string ALPHANUMERIC_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
public const string ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public const string NUMERIC = "1234567890";
Random rand = new Random();
public string GetRandomString(int length, params char[] chars)
{
string s = "";
for (int i = 0; i < length; i++)
s += chars[rand.Next() % chars.Length];
return s;
}
}
另一种选择是简单地使用:
Guid.NewGuid();
我们都知道这Guid.NewGuid()
可以满足我们的需求,但我宁愿使用自定义方法。它做同样的事情,但有更多的控制权。
我的同事认为,因为自定义方法是我们自己炮制出来的,所以更容易产生冲突。我承认我并不完全了解 Random 的实现,但我认为它与 Guid.NewGuid() 一样随机。自定义方法的典型用法可能是:
RandomStringGenerator stringGen = new RandomStringGenerator();
string id = stringGen.GetRandomString(20, RandomStringGenerator.ALPHANUMERIC_CAPS.ToCharArray());
编辑1:
- 我们正在使用没有自动增量(或类似)功能来生成密钥的 Azure 表。
- 这里的一些答案只是告诉我使用 NewGuid() “因为这就是它的用途”。我正在寻找一个更深入的原因,说明为什么在与 Guid 具有相同自由度的情况下,熟化的方法更有可能产生碰撞。
编辑2:
我们还使用成熟的方法来生成帖子 ID,与会话令牌不同,它需要看起来很漂亮才能在我们网站的 url 中显示(如http://mywebsite.com/14983336),所以这里不可以选择 guid ,但是仍然要避免碰撞。