👾

[ID衝突][Google スプレッドシート] 「リンクを知っている全員に公開」にしたときの部外者の閲覧成功確率を計算してみた

2025/01/01に公開

はじめに

Google スプレッドシートを「リンクを知っている全員に公開」に設定したとき、部外者がそのシートに辿りついて閲覧できる確率はどの程度低いのか気になってモヤモヤしてました。
というわけで、安心したくてざっくりとしたモデルを考えて計算してみました。
spreadsheetIdの仕様からして、天文学的な数字が表れるので著しく低いことは想像できるものの、確率のお勉強ということで。

閲覧成功確率を求める

モデル

  • ユーザーは、1 回/sec の頻度でブルートフォースでアクセスを試みる。
  • 世界人口:80億人 ( = 8 \times 10^9 )
  • 全世界の人々は、アクセスに試したIDをお互いに共有することはしない。
  • spreadsheetId[1]の仕様: ^[A-Za-z0-9\-_]{44}$
    • 長さ44文字のランダムな64種類の文字 (英数字(A-Z, a-z, 0-9)と -, _)
    • (この時点でもうデカい)

1年間で計算してみる

前述のモデルのもと、「全員に公開」設定されている特定のスプレッドシートに対して、全世界の人々が1年間アクセスを試みるものとする。

spreadsheetIdの総組み合わせ数 N_{\mathrm{id}}

N_{\mathrm{id}} = 64^{44} \simeq 2.96 \times 10^{79}

1ユーザー当たりの年間試行回数 n_{\mathrm{y}}

\begin{align*} n_{\mathrm{y}} &= 1 \times 60 \times 60 \times 24 \times 365 \\ &= 31,536,000 \\ &\simeq 3.15 \times 10^7 \end{align*}

1ユーザーが1年間で閲覧成功する確率 \Pr(\mathrm{user}) は、全試行の中で重複なくIDを試したものの内、特定のIDが必ず含まれていればよいので、

\begin{align*} \Pr(\mathrm{user}) &= \frac{ 1 \cdot {}_{N_{\mathrm{id}}-1} \mathrm{ C }_{n_{\mathrm{y}}-1} }{ {}_{N_{\mathrm{id}}} \mathrm{ C }_{n_{\mathrm{y}}} } \\ &= \frac{ \displaystyle\frac{ \cancel{ (N_{\mathrm{id}}-1) (N_{\mathrm{id}}-2) \cdots (N_{\mathrm{id}}-n_{\mathrm{y}}) } }{ \cancel{ (n_{\mathrm{y}}-1)! } } }{ \displaystyle\frac{ N_{\mathrm{id}} \cancel{ (N_{\mathrm{id}}-1) \cdots (N_{\mathrm{id}}-n_{\mathrm{y}}) } }{ n_{\mathrm{y}} \cdot \cancel{ (n_{\mathrm{y}}-1)! } } } \\ &= \frac{ n_{\mathrm{y}} }{ N_{\mathrm{id}} } \\ &\simeq \frac{ 3.15 \times 10^7 }{ 2.96 \times 10^{79} } \simeq 10^{-72} \end{align*}

となる。
求めるべき確率 \Pr(\mathrm{global}) は、全ユーザーが閲覧できなかった場合以外の確率になるので、

\Pr(\mathrm{global}) = 1 - ( 1 - \Pr(\mathrm{user}) )^{8 \times 10^9}

ここで、 (1 + x)^n のMaclaurin展開を考える。|x| \ll 1 のとき、以下のように近似できる

\begin{align*} (1 + x)^n &= 1 + nx + \frac{n(n-1)}{2!}x^2 + \dots \\ &\simeq 1 + nx \end{align*}

したがって

\begin{align*} \Pr(\mathrm{global}) &\simeq 1 - (1 + 8 \times 10^9 \cdot (-10^{-72}) ) \\ &= 8 \times 10^{-63} \end{align*}

やはりゴミみたいに小さい。
確率はゼロではないと言っても良いですが、一般的にゼロとするレベルの話かなと思います。
(私はよく「確率はゼロではないが、起こらない」と言ったりしています。)

(おまけ) イメージしやすくするため他の事象と比較してみる

地球上の砂粒の数は、7.5 \times 10^{18} 粒と概算されるようです。[2]
なので、今回のモデルによる確率は「地球上の砂粒から特定の1粒を見つけるのを、3連続で成功させる」よりも全然小さいです。

脚注
  1. 参考:Google Sheets API の概要 ↩︎

  2. 参考:Which Is Greater, The Number Of Sand Grains On Earth Or Stars In The Sky? : Krulwich Wonders... : NPR ↩︎

Discussion