使用arc4random生成随机字符串

时间:2014-06-08 23:05:22

标签: objective-c

我正在尝试创建一个创建由32个字符组成的随机字符串的方法。此方法将使用arc4random_uniform(62)生成一个随机数,以选择0到61之间的数字,然后从字符串中选择一个字符,该字符串包含0到9之间的数字,字母表字母分别包括小字母和大写字母。例如,如果arc4random_uniform(62)返回10,则所选字符将为a,如果返回61,则所选字符将为Z)。该方法将执行32次以创建最终生成的字符串。

我想知道这种方法何时无法生成唯一的String并导致重复的String。我搜索了这个主题,并没有找到满意的答案。我希望您能帮助我,因为我正在尝试使用此方法生成在我的应用中使用的唯一ID。

1 个答案:

答案 0 :(得分:2)

  

此方法将使用arc4random_uniform(62)生成一个随机数,以选择0到61之间的数字,然后从字符串中选择一个字符,该字符串包含0到9之间的数字,字母表字母分别包括小字母和大写字母。

您可以为要包含的所有字符创建一个包含字符串的数组,并随机选择值。或者,您可以利用ASCII编码主要是顺序字符位置,您可以相当容易地将ascii数字转换为NSString。

48到57之间的整数是ASCII中的数字0-9,65到90是A-Z而97到122是a-z:https://en.wikipedia.org/wiki/Ascii_table#ASCII_printable_code_chart

  

我想知道这种方法何时无法生成唯一的String并导致重复的String。我搜索了这个主题,并没有找到令人满意的答案。

它通常被称为“生日问题”。只要您的值相当长(例如,20个字符),就不可能发生碰撞。在接下来的2秒内,世界更容易被破坏,而不是你的应用程序造成碰撞。

  

我希望您能帮助我,因为我正在尝试使用此方法生成在我的应用中使用的唯一ID。

Apple提供了用于生成唯一ID的API。您应该使用它而不是发明自己的系统:

NSString *id = [NSUUID UUID].UUIDString;

这将为您提供类似D19B40AA-322C-4ADF-BEF6-2EC4D4CE7BA8的值。它符合UUID standard的“第4版” - 根据维基百科,如果你在接下来的100年里每秒产生10亿个UUID,那么有50%的机会获得两个相同的ID。

如果UUID比你想要的长,你可以抓住字符串的一小部分。请注意,第三个块开头的4表示这是一个“版本4”UUID并且不是随机值。此外,第4个块开头的第一个字符只有四个可能的值 - 如果你想抓住字符串的一小部分用作随机ID,请避免或删除这两个字符。有关更多详细信息,请参阅UUID上的维基百科页面。