【Swift】

UUIDを使用してユニーク(一意)な値を生成する方法

ユニークな値でDB登録したい!

投稿日 2021/12/11 更新日 2021/12/11


こんにちは。当サイトの管理者「元木皇天」です。

先日、iOS向けアプリ制作中にDBに値を登録する際に「Swiftではどうやって一意になるキーを生成するのだろうか?」と疑問に思い調査したので、 そのときの備忘録としてここにまとめておこうと思います。

iOSでアプリを制作している方に参考にしていただけたら嬉しいです。

環境
OS:MacOS Big Sur
Xcode:バージョン12.3
Swift:バージョン5.3

やりたいこと

1.ユニークな値の生成

例:F6FB8EAF-D6E9-4870-9B35-E1F0027181C8

(生成するたびに異なる値が生成される。)


2.デバイス別のユニークな値の生成

例:29302F0C-AE49-46E4-97BD-CEB3A4516080

(デバイスごとに同じ値が生成される。)

参考文献
UUID init Apple Developer Site
uuidString Apple Developer Site
identifierforvendor Apple Developer Site

ユニークな値の生成

Swiftでユニーク(一意)な値を生成するにはUUID構造体(struct UUID)uuidStringを使用します。

import Foundation
//ユニークな値の生成
let uniqueId: String = UUID().uuidString

念のための記載ですが、UUIDは「Foundation」フレームワークに搭載されているのでインポート(import)は忘れずに行ってください。

実際に実行すると以下のような結果になります。

どれも一意な値が生成されていることがわかります。

uuidStringの実行結果10回分

--補足--

.uuidStringを使用せず、UUID()のみでも同じ値が得られます。その場合は型がStringではなくUUID型になりますので、取り扱いに注意してください。

UUIDとuuidStringの型比較

デバイス別にユニークな値の生成

次はデバイス別にユニークな値を生成する方法について解説いたします。

デバイス別というのは、例えばiPhone A とiPhone B があった場合、その端末ごとにという意味です。

こちらは、オンライン系のアプリを制作する場合に使用するのではないかなと個人的に思いました。(オンライン用アプリは作ったことがないのでわからないです、すいません。)

端末ごとに一意な値が得られるので、ユーザをうまく管理したい時などに使えるかなと思います。見当違いでしたらすいません。


デバイスごとに一意な値を生成するする方法は以下の通りです。

import UIKit
//デバイス別にユニークな値を生成
let deviceUniqueId: String = UIDevice.current.identifierForVendor!.uuidString

こちらは先ほどとは違いUIKitフレームワークに搭載されているのでimport内容を間違えないように注意が必要です。

また、「identifierForVendor」はUUID構造体のオプショナル型を返すので、アンラップするのを忘れずに行いましょう。

以下、実際に実行した際の結果です。先ほどとは異なりデバイスごとに一意になるため何度呼び出しても同じ値が得られることがわかります。

identifierForVendorの実行結果10回分

重複値が生成されることはあるのか?

さて、この方法でユニークな値を生成して本当に重複することはないのか?とここまできて疑問に思う方がいるかもしれませんので 一応このようなトピックを持たせていただきました。

結論から言ってしまえば、重複する確率は天文学的数値なので限りなく重複することはないと言える、という結論になります。

実際に計算すると以下のような確率になります。

1.UUIDで生成される値は16進数(0~F)の32桁の値

2.そのため生成される文字の組み合わせパターンは16^32(16の32乗)

3.16^32 = 340282366920938463463374607431768211456
≒ 340 × 10^36 = 340澗(澗は兆の1000000000000倍)

∴同じ値が重複する可能性は限りなく低い。

どうしても重複する可能性を心配してしまうのであれば、生成したUUIDの末尾に生成した日付や時間をつければ良いと思います。

まとめ

Swiftでユニークな値を生成するには
UUID().uuidString
UIDevice.current.identifierForVendor!.uuidString
を使用する。

参考文献・おすすめ文献