# 4. SecRandomCopyBytes 生成伪随机数

作者：南峰子

在iOS中，生成伪随机数可以使用这么几个函数：`rand()`、`random()`、`arc4random()`。另外我们知道随机数是密码技术的核心部分，所以 Apple 也为我们提供了相应的生成随机数的方法，即 SecRandomCopyBytes，这个方法位于 `Security.framework` 中，所以使用时需要先导入这个库，使用的方法如下：

```
+ (NSString *)generateRandom {

    static int size = 8;
    uint8_t randomBytes[size];
    int result = SecRandomCopyBytes(kSecRandomDefault, size, randomBytes);
    if (result == errSecSuccess) {
        NSMutableString *randomString = [[NSMutableString alloc] initWithCapacity:size * 2];
        for (int i = 0; i < size; i++) {
            [randomString appendFormat:@"%02x", randomBytes[i]];
        }

        return randomString;
    } else {
        return nil;
    }
}
```

这里我们生成一个 8 字节长的 uint8\_t 数组，然后将其转换成 hex 字符串得到一个长度16的随机字条串。另外这个函数也可以作为生成 UUID 的辅助操作，如下代码所示：

```
+ (NSString*)generateCryptoSecureUUID
{
    unsigned char bytes[16];
    int result = SecRandomCopyBytes(kSecRandomDefault, 16, bytes);
    if (result != noErr) {
        return nil;
    }
    return [[NSUUID alloc] initWithUUIDBytes:bytes].UUIDString;
}
```
