ハッシュ衝突の期待値
100個のキーを128個のバケットに振り分けると、平均で半数を超えるキーが他のキーとバケットを共有します。負荷率は0.78125です。空きバケットやあふれたキーの数も分かります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- N
- 100
- M
- 128
- 負荷率
- 0.78125
- 予想される衝突キー数
- 53.9975057729
- 予想される単独キー数
- 46.0024942271
- 予想される使用済みバケット数
- 69.5768323316
n個の相異なる鍵をm個のバケットへ一様にハッシュすると、負荷率が控えめでさえ、一部の鍵は同じ枠を共有します。直感は占有を過小評価します。誕生日のパラドックスで少なくとも一組が衝突する確率を思い出し、その確率を個数であるかのように扱うのです。このハッシュ衝突の期待値計算機は、別の計画上の問いに答えます。古典的な玉入れモデルを用い、各要素がm個のバケットのうち一つを独立かつ一様に選び、衝突する鍵の期待個数、すなわち自分のバケットで独りではない鍵の数を返します。その主指標に加え、単独の鍵、使用中と空のバケット、最初の入居者を超える溢れ鍵、対ごとの衝突、負荷率n割るmを報告します。演算は対数空間で評価する閉じた恒等式で、完全に決定的であり、モンテカルロ標本も言語モデルも使いません。ハッシュ表の寸法決め、負荷率の調整、32ビットのハッシュ空間とより狭い空間の比較、あるいはメモリを確保する前に教科書の占有主張を確かめる用途にご利用ください。
玉入れモデルで衝突する鍵の期待値が測るもの
n個の玉を独立かつ一様にm個の箱へ投げ入れると、一様ハッシュの標準モデルになります。衝突する鍵とは、少なくとももう一つの玉と同じ箱を共有する玉です。これは少なくとも二つの玉が箱を共有する誕生日のパラドックスの確率とは別の量であり、対ごとの一致数とも違います。
容量計画では普通、個数が欲しくなります。平均して何個の鍵が専用枠を得られないか、他が溢れる一方で何個のバケットが空のままか、最初の入居者の上に何個の余分な鍵が積もるかです。期待値の線形性により、シミュレーションなしできれいな答えが出ます。
任意の一つの鍵を固定してください。残りのn引く一個は、その鍵のバケットを確率いち引くいち割るmで外すので、選んだ鍵が単独である確率は(1 − 1/m)のn引く一乗です。nを掛ければ単独鍵の期待個数です。
nから引けば衝突する鍵の期待個数、すなわちnかけるいち引く(1 − 1/m)のn引く一乗です。同じ占有の議論から、空バケットの期待個数はmかける(1 − 1/m)のn乗となり、したがって使用中バケットも得られます。溢れ鍵は各使用中バケットの最初を超える要素で、n引く使用中に等しいです。
対ごとの衝突はn個から二つを選ぶ数をmで割ったもので、特定の対が同じ場所に落ちる確率がいち割るmだからです。負荷率は単にn割るmです。これらの数値を合わせると、提案した表がバケット不足か、単に忙しいだけか、より大きなmで取り除ける鎖長の税をすでに払っているかが分かります。
入力契約、数式、数値安定性、誤り
必須の整数を二つ送ってください。nは要素数、mはバケット数です。どちらも公開された範囲内の有限整数である必要があります。
nは一から一兆まで、mも一から一兆までで、教室の例、メモリ上の対応表、四十二億九千四百九十六万七千二百九十六枠の完全な32ビットハッシュ空間をカバーします。検証のあと、エンジンはいち引くいち割るmの冪を、指数かけるマイナスいち割るmのlog1pの指数関数として対数空間で評価します。
そのため大きなnとmが、素朴な掛け算の繰り返しのように静かな零へアンダーフローしません。特殊な場合は厳密です。 要素が一つなら決して衝突しません。バケットが一つで要素が二つ以上ならすべての鍵が衝突します。
指数が零のときは一とみなし、(1 − 1/m)の零乗が不定な零の零乗にならないようにします。
容量計画、上限、料金、数値が役立つ場面
表の大きさを選ぶとき、負荷率を比べるとき、負荷率いちでも多くの鍵がバケットを共有する理由をチームに説明するときは、ブラウザの道具をお使いください。衝突する鍵の期待値や溢れ鍵がサービス水準の予算を下回るまでmを上げ、成長のための余裕を残してください。何らかの衝突が存在する確率も必要な場合は、誕生日のパラドックスの確率と対比してください。
その確率は、衝突する鍵の期待個数が大きくなるよりずっと前にいち近くへ飽和するため、二つの道具は別の用件に答えます。結果は完全に決定的です。同じnとmは常に同じ占有ベクトルを返すので、試験や教材に例を固定できます。
言語モデルも外部の統計サービスも乱数性もありません。正確な玉入れの恒等式を、いつまでも落ち着かない近似標本のヒストグラムより好む場合は、ハッシュ表の教程、キャッシュ断片の計画、ブルームに近い占有確認、プログラミング面接の神託へこの端点をつないでください。
活用例
ハッシュ表と対応表の寸法決め
作業集合の鍵数をnとし、衝突する鍵の期待値と溢れ鍵が遅延予算を下回るまでm(表の枠)を掃引してください。
キャッシュ断片と区画の占有
断片をバケット、到着する鍵を玉とみなし、容量を足すか再ハッシュする前に、熱い区画を何個の鍵が共有するかを見積もります。
授業と試験のための決定的な神託
講座、面接基盤、CI一式は、一未満のnやmを拒み、同じ入力に同じ欄を返す安定した占有の神託を呼び出します。
よくある質問
この計算機で衝突する鍵とは何ですか?
自分のバケットで独りではない鍵です。期待個数はnから単独の期待個数を引いたものです。少なくとも一組が衝突する確率ではなく、期待個数です。
誕生日のパラドックスと何が違いますか?
誕生日のパラドックスはP(共有日が少なくとも一つ)を返します。本道具はハッシュ調整向けの期待占有個数、すなわち衝突する鍵、溢れ鍵、空バケット、対ごとの衝突を玉入れのもとで返します。
nまたはmが1未満だとどうなりますか?
要素もバケットも少なくとも一つ必要です。零と負の値は拒まれ、課金されません。
空のまま残るバケットは平均でいくつですか?
バケット数に、あるバケットにどのキーも入らない確率を掛けた値です。100個のキーと128個のバケットでは、半数を超えるキーが共有している一方で、バケットのほぼ半分が空のまま残ります。
あふれたキーとは何ですか?
使われているバケットで、最初のキーより後から入ったキーのことです。キーの数から使われているバケットの数を引いた値で、すでに埋まった場所に重なるキーの数を表します。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/hash-expected-collisions \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"n":100,"m":128}'const res = await fetch("https://api.kit.forhosting.com/dev/hash-expected-collisions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"n": 100,
"m": 128
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/hash-expected-collisions",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"n": 100,
"m": 128
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/hash-expected-collisions", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"n":100,"m":128}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"n":100,"m":128}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/hash-expected-collisions", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"n": 100,
"m": 128
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.hash_expected_collisions",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_n | 1000000000000 |
max_m | 1000000000000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
入力契約、数式、数値安定性、誤り
nには別名items、keys、balls、mにはbuckets、binsも受け付けます。欠落した欄、非整数、一未満のnやm、上限を超える値はinvalid_inputで失敗し、課金されません。JSON本体はnとmを繰り返し、続けてload_factor、expected_colliding_keys、expected_singleton_keys、expected_occupied_buckets、expected_empty_buckets、expected_collision_buckets、expected_overflow_keys、expected_pairwise_collisions、および二つの主恒等式を言い直すformula文字列を返します。
容量計画、上限、料金、数値が役立つ場面
脚本、面接用の砂場、データベース調整の手帳、継続的統合の検査が、一つの契約のもとで多数の(n, m)組に対する安定したJSONを必要とするときはAPIをお使いください。成功した各依頼は$0.002の課金対象一件となり、検証の失敗は残高を消費しません。公開された範囲は、閉じた評価を通常のIEEE-754倍精度に収めつつ、手で寸法を決める実用的なハッシュ表をすべて覆います。
技術的な質問
n個の鍵とm個のバケットのハッシュ衝突の期待値はどう見積もりますか。
整数n(要素)とm(バケット)をdev.hash_expected_collisionsへ送ってください。応答にはexpected_colliding_keys = n*(1-(1-1/m)^(n-1))に加え、使用中、空、溢れ、対ごと、load_factorが含まれます。
ハッシュ衝突の期待値計算機は無料ですか。
ブラウザの道具はお使いの機器上で無料です。API呼び出しは成功一件あたり$0.002の前払いKIT残高を使い、検証失敗は課金されません。