在Swift中类似于Youtube ID的短随机唯一字母数字键

时间:2015-07-29 13:07:01

标签: ios objective-c swift

有没有办法在Swift中创建类似于YouTube ID的随机唯一ID?

我知道这个link有类似的答案,但它们是针对Php的。但是我想要一些Swift中的东西。

我曾尝试使用时间戳和UUID,但我想要一个字母数字的短按键,大约4到10个字符,这样用户就可以轻松地与他人口头分享。

感谢。

7 个答案:

答案 0 :(得分:18)

只寻找一个独特的字符串

您可以使用UUID这些非常酷:

let uuid = NSUUID().UUIDString
print(uuid)

来自 docs

  

UUID(通用唯一标识符),也称为GUID(全球唯一标识符)   唯一标识符)或IID(接口标识符)是128位   值。 NSUUID创建的UUID符合RFC 4122第4版   用随机字节创建。

有关uuid的一些信息:https://en.wikipedia.org/wiki/Universally_unique_identifier

寻找更具体的长度

尝试这样的事情:

func randomStringWithLength(len: Int) -> NSString {

    let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

    let randomString : NSMutableString = NSMutableString(capacity: len)

    for _ in 1...len{
        let length = UInt32 (letters.length)
        let rand = arc4random_uniform(length)
        randomString.appendFormat("%C", letters.character(at: Int(rand)))
    }

    return randomString
}

但我会保留我的答案,因为其他人偶然发现了寻找UUID

答案 1 :(得分:8)

这将允许您创建随机短代码。它可以从十六进制创建代码,一直到62个代码和不同长度。

又名。

let myCode = ShortCodeGenerator.getCode(length: 6)

3dH7t8, fdE7j1, Gl6jKd, Hv8gU3,

let myBase32Code = ShortCodeGenerator.getCode(withBase: UInt32(32), length: 6)

3HF75J, J67N9D, B47SO3, L9SD2N

您必须检查冗余,然后创建一个新的,如果已经使用过。

struct ShortCodeGenerator {

    private static let base62chars = [Character]("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".characters)
    private static let maxBase : UInt32 = 62

    static func getCode(withBase base: UInt32 = maxBase, length: Int) -> String {
        var code = ""
        for _ in 0..<length {
            let random = Int(arc4random_uniform(min(base, maxBase)))
            code.append(base62chars[random])
        }
        return code
    }
}

这个答案在创建上面的代码时很有用,也很好 information on the number of unique identifiers you can have with each base number and length.

您需要的唯一标识符总数可以通过以下公式计算:

BaseNumber ^ length =唯一ID数量

编辑:

I have added even more functionality for converting Int's and NSDate's to shortcodes for my own project as well and put those into a project on GitHub.

答案 2 :(得分:4)

<!DOCTYPE html> <html> <body> <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"> Your browser does not support the HTML5 canvas tag.</canvas> <script> var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); var array = [0,40,80,120,160]; var height = 150; var width = 300; for (i = 0; i < array.length; i++) { ctx.beginPath(); ctx.moveTo(array[i],height); ctx.lineTo(((width*0.075) + array[i]),0); ctx.lineTo(((width*0.15 + array[i])),(height)); ctx.closePath(); ctx.fill(); } </script> </body> </html>能做你需要的吗?

答案 3 :(得分:3)

  

更新了swift 3:

如果要生成短随机唯一字母数字键,请在下面的代码行中使用;

//功能定义:

func generateTransactionId(length: Int) -> String {
    var result = ""
    let base62chars = [Character]("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".characters)
    let maxBase : UInt32 = 62
    let minBase : UInt16 = 32

    for _ in 0..<length {
        let random = Int(arc4random_uniform(UInt32(min(minBase, UInt16(maxBase)))))
        result.append(base62chars[random])
    }
    return result
}

//函数调用:

let mTranactionId = self.generateTransactionId(length: 5) // you can change the value of length as you want
print("mTranactionId: \(mTranactionId)")

Ex:结果如下:XHA7K,QTC92,MS1PT,YE2PV

//享受编码......!

答案 4 :(得分:0)

快速自定义替代项(这些版本不检查重复的字符):

func randomString(length: Int) -> String {
    let letters = Array("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
    var randomString: String = ""
    for _ in 0..<length {
        let randomNumber = Int.random(in: 0..<letters.count)
        randomString.append(letters[randomNumber])
    }
    return randomString
}

答案 5 :(得分:0)

我对 NanoID 非常满意。

https://github.com/ai/nanoid

...这是 SWIFT 版本:

https://github.com/antiflasher/NanoID

您只需将 1 个文件 (NanoID.swift) 拖到您的项目中,就可以了!

标签:短 GUID、短 UUID、短唯一 ID、Swift、iOS

答案 6 :(得分:0)

您只需使用 UUID 即可存档。

如果您不想要整个字符串,如 Swift 中的任何 String,您可以使用 range 选择字符串的一小部分,如下所示:

let text = UUID().uuidString
let index = text.index(text.startIndex, offsetBy: 8)
let small = text[text.startIndex..<index]

注意 8 是我建议的字符串长度,例如,您可以通过使用 min(size, text.count) 限制此值来改进这一点。

最后,small 是一个 Substring,将它投射到 String 就像往常一样 - String(small)