我正在尝试编写一个服务,当每个用户第一次使用该服务时,他将被分配一个唯一的名称。我希望生成此名称,而不是让用户设置它。另外,我希望这个名称有点可读性和令人难忘,而不是听起来像 GUID 或时间戳。本质上,我希望这类似于 Xbox 玩家代号。
我知道永远不会有超过 1000 个用户,因此保持唯一性不会成为问题(我可以避免使用 GUID 的另一个原因)
我正在考虑从字典中提取一些形容词、名词等,并生成它们的随机但独特的组合。
有什么建议么?
我正在尝试编写一个服务,当每个用户第一次使用该服务时,他将被分配一个唯一的名称。我希望生成此名称,而不是让用户设置它。另外,我希望这个名称有点可读性和令人难忘,而不是听起来像 GUID 或时间戳。本质上,我希望这类似于 Xbox 玩家代号。
我知道永远不会有超过 1000 个用户,因此保持唯一性不会成为问题(我可以避免使用 GUID 的另一个原因)
我正在考虑从字典中提取一些形容词、名词等,并生成它们的随机但独特的组合。
有什么建议么?
您可以使用英语 n-gram 语料库(例如三个字母序列)并使用它们来生成看起来像英语但实际上完全是胡言乱语的单词。这种数据本质上是随机的,但对人类语言和记忆的性质具有柔软性。
这与我正在谈论的类似,只是它将整个单词概率性地组合成句子。我更多地考虑通过将字母序列组合成虚构的单词来做到这一点。
编辑实际上这个页面讨论了我在说什么。
这只是一个完全解决您的问题的代码示例。如果它不能解决它,请尝试在您的问题中更具体。System.Random
将类的实例和单词列表(您的字典)传递给以下方法。
static string GetGuid(Random random, IList<string> words)
{
const int minGuidSize = 10;
const int maxGuidSize = 15;
var builder = new StringBuilder();
while (builder.Length < minGuidSize)
builder.Append(words[random.Next(words.Count)]);
return builder.ToString(0, Math.Min(builder.Length, maxGuidSize));
}
您可以使用此 10 000 个随机名称列表: http ://www.opensourcecf.com/1/2009/05/10000-Random-Names-Database.cfm
或者使用这个网站生成一个随机的名字列表:http: //www.fakenamegenerator.com/order.php
安全的方式。维护剩余未使用名称的列表。
简单的方法(也非常可扩展)但不安全。依靠 2 个用户随机获得相同 id 的可能性。
我会尝试获取大约一千种模式的 3 或 4 个列表,然后在每个列表中随机选择一个值。这将产生大约 10E12 种可能性,足以避免 1000 个用户发生冲突。
JohnLampMartin2212