機能ロールアウト用の安定した割合バケットを計算
割合によるロールアウトは、同じ利用者に毎回同じ判定が返る場合にのみ役立ちます。この計算機は、安定したユーザー、アカウント、端末、またはテナントの識別子を10,000個の決定論的バケットのいずれかに割り当て、指定された割合と比較します。符号なしハッシュ、読みやすい割合バケット、最終的な対象判定を返します。乱数、時刻、ネットワーク要求、保存済みの割り当てには依存しないため、同一の入力からは常に同一の出力が得られます。
無料で実行
ロールアウト対象を表す識別子を選択してください
機能を割り当てる単位で一意かつ安定しており、判定を行うすべての場所で利用できる識別子を選んでください。個人向け画面の実験にはユーザーIDが適していますが、組織の全員に同じ動作を提供する場合は、アカウントIDまたはテナントIDのほうが一般に適しています。端末識別子は匿名の体験にも利用できますが、ローカルストレージを消去すると割り当てが変わる可能性があります。この計算機は識別子を厳密な文字列として扱います。大文字と小文字、空白、句読点、Unicode文字はすべてハッシュに影響します。複数のシステムが異なる表記を生成する可能性がある場合は、呼び出し前に識別子を正規化してください。たとえば、メールアドレス形式の値を小文字にするか、数値IDに先頭のゼロを付けるか、本番や検証などの名前空間を値に含めるかを決めます。表示名のように変更されるプロフィール情報は使用しないでください。一度規則を選んだら維持してください。識別子を変更すると、同じ人物やアカウントでもバケットが変わります。
決定論的なバケット計算の仕組みをご確認ください
この機能は識別子をUTF-8で符号化し、32ビットのFNV-1aハッシュアルゴリズムを適用します。符号なしハッシュを10,000個のベーシスポイントバケットのいずれかに変換し、0から99.99までの数値で表示します。バケットが、指定割合に100を掛けた値より厳密に小さい場合、その対象は含まれます。この境界規則により、ゼロパーセントでは誰も含まず、百パーセントでは全員を含むという明確な端点が保証されます。また、0.01パーセントポイント単位で変更できます。乱数シード、時刻、ストレージ、ネットワークを使わないため、同じ識別子と割合は常に同じ結果になります。割合を上げると既存の対象を保持したまま次の範囲が追加され、下げると上端側から対象が外れます。このハッシュはロールアウトの運用上の割り当てには適していますが、暗号学的な安全性はありません。返された値を秘密情報として扱ったり、識別子の秘匿や認可判定に使用したりしないでください。
リリース手順で結果を安全に利用してください
対象かどうかを示す真偽値は、明示的な利用資格規則、環境確認、緊急時の上書きと組み合わせ、機能配信を決める入力の一つとして使用してください。一般的なサービスでは、未対応のプランや地域を先に除外し、残った利用者について割合割り当てを計算します。利用者ごとに別の乱数割り当てを保存する必要はなく、ロールアウト設定を保存すれば、決定論的な計算によって必要なときに判定を再現できます。公開範囲を広げる前に、対象コホートの運用指標と事業指標を比較し、迅速な全体無効化手段を準備してください。複数の独立した機能が同じ識別子だけを使うと、バケット順序が相関します。各ロールアウトで別の対象群が必要な場合は、機能名、区切り文字、ユーザーIDのように、安定した機能キーを識別子へ追加してください。そのキーはロールアウト中に変更しないでください。エンドポイントはゼロ未満または百を超える割合を自動補正せず拒否するため、設定ミスを把握できます。呼び出し料金は$0.002で、ブラウザー版も同じ純粋な計算を使用します。
活用例
本番リリースを段階的に進める
対象利用者の安定した一部に新機能を公開し、既に含まれる利用者を入れ替えずに割合を引き上げられます。
テナント内の体験を統一する
アカウントまたはテナントの識別子をハッシュ化し、同じ組織の全員に同一の判定を返します。
ロールアウト設定を監査する
報告された利用者のバケットを再計算し、その割合しきい値で対象になるべきだったかを説明できます。
よくある質問
同じ識別子には常に同じ結果が返りますか?
はい。同一の識別子文字列と割合からは同じ出力が得られます。乱数、日付、ネットワーク、保存済み状態は使用しません。
ゼロパーセントと百パーセントではどうなりますか?
ゼロパーセントでは識別子を一つも含まず、百パーセントでは有効な識別子をすべて含みます。
既存利用者を入れ替えずに公開範囲を広げられますか?
はい。しきい値を上げると、既に含まれるすべてのバケットを維持したまま、新しい範囲が追加されます。
このハッシュは暗号学的に安全ですか?
いいえ。FNV-1aは決定論的な分散のための高速ハッシュです。パスワード、認可、秘匿、匿名化には使用できません。
機能ごとのロールアウトを独立させるにはどうしますか?
安定した対象識別子の前後に、固定の機能キーと区切り文字を追加し、その規則を維持してください。
API呼び出しの料金はいくらですか?
各リクエストの料金は$0.002です。ブラウザー計算機は同じ決定論的計算をローカルで実行します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/feature-toggle-rollout-percent \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"identifier":"user_48291","rollout_percentage":25}'const res = await fetch("https://api.kit.forhosting.com/dev/feature-toggle-rollout-percent", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"identifier": "user_48291",
"rollout_percentage": 25
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/feature-toggle-rollout-percent",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"identifier": "user_48291",
"rollout_percentage": 25
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/feature-toggle-rollout-percent", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"identifier":"user_48291","rollout_percentage":25}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"identifier":"user_48291","rollout_percentage":25}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/feature-toggle-rollout-percent", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"identifier": "user_48291",
"rollout_percentage": 25
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.feature_toggle_rollout_percent",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |