Calcule uma faixa percentual estável para liberar recursos
Uma liberação percentual só é útil quando a mesma pessoa recebe sempre a mesma decisão.
Executar grátis
Esta calculadora transforma um identificador estável de usuário, conta, dispositivo ou tenant em uma de 10,000 faixas determinísticas e compara essa faixa ao percentual informado. Ela retorna o hash sem sinal, a faixa percentual legível e a decisão final de inclusão. Nenhum valor aleatório, relógio, acesso à rede ou atribuição armazenada interfere no resultado; portanto, entradas idênticas sempre geram a mesma saída.
Escolha um identificador que represente o público da liberação
Comece com um identificador estável, único no nível em que o recurso deve ser atribuído e disponível em todos os pontos onde a decisão é tomada. Um ID de usuário é adequado para um experimento de interface individual, enquanto um ID de conta ou tenant costuma ser melhor quando todos os integrantes de uma organização precisam receber o mesmo comportamento. Identificadores de dispositivo podem funcionar em experiências anônimas, mas a limpeza do armazenamento local pode alterar a atribuição. A calculadora considera o identificador como texto exato: maiúsculas, espaços, pontuação e caracteres Unicode participam do hash. Por isso, normalize os identificadores antes de chamar a capacidade se sistemas diferentes puderem representá-los de maneiras distintas. Defina, por exemplo, se identificadores semelhantes a e-mails serão convertidos em minúsculas, se IDs numéricos terão zeros à esquerda e se o valor incluirá um namespace como produção ou homologação. Não use dados mutáveis do perfil, como o nome de exibição. Depois de escolher uma convenção, mantenha-a, pois mudar o identificador também muda a faixa.
Entenda o cálculo determinístico da faixa
A capacidade codifica o identificador em UTF-8 e aplica o algoritmo de hash FNV-1a de 32 bits. O hash sem sinal é reduzido a uma de 10,000 faixas de pontos-base, exibida como um número entre 0 e 99.99. O participante é incluído quando sua faixa é estritamente menor que o percentual solicitado multiplicado por 100. Essa regra de limite garante extremos úteis: zero por cento não inclui ninguém e cem por cento inclui todos. Ela também permite mudanças de 0.01 ponto percentual. Como o processo não usa semente aleatória, horário, armazenamento nem rede, o mesmo identificador e percentual sempre produzem a mesma resposta. Aumentar o percentual preserva todos os participantes já incluídos e acrescenta identificadores das faixas seguintes; reduzi-lo remove participantes do extremo superior. O hash é apropriado para atribuição operacional de liberações, não para segurança criptográfica. Não trate o valor retornado como segredo, não o use para ocultar identificadores e não baseie decisões de autorização nele.
Use o resultado com segurança no processo de lançamento
Use o booleano de inclusão como uma das entradas da entrega do recurso, junto com regras explícitas de elegibilidade, verificações de ambiente e substituições de emergência. Um serviço típico primeiro exclui planos ou regiões incompatíveis e depois calcula a atribuição percentual para o público restante. Armazene a configuração da liberação, e não uma atribuição aleatória separada para cada usuário, pois o cálculo determinístico recria a decisão sempre que necessário. Antes de ampliar a exposição, compare métricas operacionais e comerciais entre as coortes elegíveis e prepare um mecanismo rápido de desativação global. Se vários recursos independentes usarem apenas o mesmo identificador, a ordem de suas faixas ficará correlacionada; acrescente uma chave estável do recurso ao identificador, como nome do recurso, separador e ID do usuário, quando cada liberação precisar de um público independente. Mantenha essa chave durante toda a liberação. O endpoint rejeita percentuais abaixo de zero ou acima de cem, em vez de ajustá-los silenciosamente, tornando visíveis os erros de configuração. Cada chamada custa US$ 0,002; a versão no navegador usa o mesmo cálculo puro.
Casos de uso
Fazer um lançamento gradual em produção
Libere um novo recurso para uma fração estável do público elegível e aumente o percentual sem redistribuir quem já estava incluído.
Manter a experiência consistente por tenant
Calcule o hash de uma conta ou tenant para que todos os integrantes da organização recebam a mesma decisão.
Auditar a configuração da liberação
Recalcule a faixa de um usuário informado para explicar se determinado limite percentual deveria incluí-lo.
Perguntas frequentes
O mesmo identificador sempre receberá o mesmo resultado?
Sim. Texto do identificador e percentual idênticos produzem a mesma saída, pois o algoritmo não usa aleatoriedade, data, rede nem estado armazenado.
O que acontece em zero e cem por cento?
Zero por cento não inclui nenhum identificador; cem por cento inclui todos os identificadores válidos.
Posso ampliar uma liberação sem redistribuir os usuários atuais?
Sim. Elevar o limite preserva todas as faixas já incluídas e acrescenta as faixas do novo intervalo.
O hash é criptograficamente seguro?
Não. FNV-1a é um hash rápido de distribuição determinística. Ele não deve ser usado para senhas, autorização, sigilo nem anonimização.
Como tornar independentes as liberações de recursos diferentes?
Adicione uma chave estável do recurso e um separador antes ou depois do identificador e mantenha essa convenção.
Quanto custa uma chamada da API?
Cada solicitação custa US$ 0,002. A calculadora do navegador executa localmente o mesmo cálculo determinístico.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"identifier": "user_48291",
"rollout_percentage": 25
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.feature_toggle_rollout_percent",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |