CarrierwaveでUUIDを使ったファイル名にする方法
UUIDとは
- Universally (普遍的に) Unique (一意な) IDentifier (識別子) の略
- 誰でも作れるが世界中で重複しないようになっているID
- RFC4122という共通の規格が決められている
UUIDの種類
- UUIDの作成方法には5種類存在する。
1: 時刻とMACアドレスを元にするバージョン 2: DCEセキュリティバージョン 3: バイト列を元にするバージョン。MD5ハッシュを利用 4: ランダム生成するバージョン 5: バイト列を元にするバージョン。SHA-1ハッシュを利用
- RubyのSecureRandom.uuidはバージョン4
- 16進数を32桁で乱数生成したもの
- 340澗(かん)通り。重複はしないと考えていい。
www.slideshare.net
なぜUUIDを使うのか?
- ファイル名にIDを使っている場合、推測ができてしまい他のユーザーが閲覧できてしまう
- IDからサービスのユーザー数がバレてしまう
上記のようなニーズからUUIDは使われる
UUIDにする方法
- xxx_uploader.rbのfilenameメソッドを上書きすればいい
def filename "#{SecureRandom.uuid}.#{file.extension}" if original_filename end
公式では以下のような書き方がサンプルにあるが、uuidだけでも十分だし読みやすいのでいいのではと思っている。
def filename "#{secure_token}.#{file.extension}" if original_filename.present? end protected def secure_token var = :"@#{mounted_as}_secure_token" model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) end