Module: Decentworks::HexdigestSupport::TimeLike
- Included in:
- ActiveSupport::TimeWithZone, DateTime, Time
- Defined in:
- lib/decentworks/hexdigest_support/time_like.rb,
sig/decentworks/hexdigest_support/time_like.rbs
Overview
時刻(ある一瞬)を表す型に共通の入力生成
MEMO: Time / DateTime / ActiveSupport::TimeWithZoneへincludeする。Rubyの クラス階層上は無関係な3つだが、いずれも「ある一瞬」を表す点は同じなので ダイジェストの入力は共通化する
Instance Method Summary collapse
-
#to_hexdigest_source ⇒ ::String
ハッシュ値を求めるためのオリジナルの値.
-
#to_hexdigest_type ⇒ ::String
ハッシュ値化に用いる型の識別子.
Instance Method Details
#to_hexdigest_source ⇒ ::String
ハッシュ値を求めるためのオリジナルの値
MEMO: UTCへ変換してから文字列化する。#to_sはタイムゾーンのオフセットを含むため、 同じ瞬間を指す時刻でも実行環境やTime.zoneの設定次第で異なる値になってしまう
MEMO: 精度はナノ秒で固定する。秒へ丸めると同一秒内の異なる時刻が衝突し、 小数部を可変長にすると1.0秒と1秒が異なる値になってしまう
MEMO: time(stdlib)の#iso8601ではなく#strftimeで組み立てる。ネイティブの 文字列表現に依存させないという方針はHash#to_hexdigest_sourceと同じ
MEMO: Timeはナノ秒より細かい精度を持ちうるが、その桁は切り捨てる。 DBのtimestamp(多くはマイクロ秒)と往復させても値が変わらない粒度に揃えるため
MEMO: 先に#to_timeを挟むのは、DateTimeとTimeWithZoneをTimeへ寄せるため。 Time#to_timeは自身を返すので、Timeにとっては実質的に無害
39 |
# File 'lib/decentworks/hexdigest_support/time_like.rb', line 39 def to_hexdigest_source = to_time.getutc.strftime("%Y-%m-%dT%H:%M:%S.%9NZ") |
#to_hexdigest_type ⇒ ::String
ハッシュ値化に用いる型の識別子
MEMO: 実装クラス名ではなく"Time"へ正規化する。Railsでは同じ瞬間が経路によって 別のクラスで現れる(Time.zone.nowやActiveRecordのdatetimeカラムは ActiveSupport::TimeWithZone、Time.nowやFile.mtimeはTime)ため、 クラス名を型にすると入力経路の違いだけでダイジェストが割れてしまう
MEMO: 「型で区別する」という本gemの原則に対する意図的な例外。Rangeの端点を first / lastというキー名に固定しているのと同じく、実装ではなく意味論に 合わせた割り切り
21 |
# File 'lib/decentworks/hexdigest_support/time_like.rb', line 21 def to_hexdigest_type = "Time" |