2013-10-20 106 views
0

我只是想知道通常的方法是生成一个任意长度的随机大小写字母的唯一字符串?生成随机上/下字母的唯一5字符序列?

我的直接想法是使用我使用的编程框架提供的guid生成器,然后将一个众所周知的散列算法应用于guid。

如果是这样的话,我需要研究哪些类型的散列函数?

感谢

+1

'random!= unique'!即使是guid在技术上也不是独一无二的。只有非常非常不可能的是,同一个将会被生产两次。这只是由于guid基本上是非常大的数字(比5个字符多得多*),并且创建它们的算法具有非常好的分布。如果你确实需要保证唯一性,那么你需要“记住”你生成的所有东西,如果你得到了已经生成的东西,就要再次生成。 – Corak

+0

或者更好的是,对于相对较小的范围:生成*所有*可能性,然后随机选择一个并将其从下一次的可能性列表中删除。 – Corak

回答

1

创建一个GUID是不是得到一个随机数的好方法,如在GUID并不是所有的数据是随机的。请使用Random类。例如:然而

string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
int len = 5; 

Random rnd = new Random(); 
StringBuilder b = new StringBuilder(len); 
for (int i = 0; i < len; i++) { 
    b.Append(chars[rnd.Next(chars.Length)]); 
} 
string result = b.ToString(); 

注意,这并不保证代码是独特。为了实现这一点,你必须保存所有以前的代码,并检查那些用于任何新代码的代码。尽管GUID被认为足够不足,但从GUID生成的短散列没有该属性。

+0

非常感谢你,一个优雅的解决方案,绝对是我的一个想法。 – ShaunO

+0

“随机”不是一个密码安全的随机数生成器。可以从几个输出值中导出发生器的内部状态(并因此预测所有未来和以前的随机值),所以它不能用于不可能发生的情况。 .NET API确实有一个密码安全的随机生成器,但由于我对.NET不熟悉,所以我无法提供帮助。 – ntoskrnl

+0

@ntoskrnl:这是真的,但加密保护并不意味着它是唯一的。 – Guffa