其他答案已经解释了为什么您无法执行所需的计算,因为您使用的数字大小存在差异。但是,正如我在评论中提到的,您可以尝试使用较小的数字来显示趋势。我们将“预计”值称为size_of_key_space / (2 * number_of_keys)。对于获得 50% 的成功概率,这是一种幼稚的期望值。为了证明这一点,我对许多不同的键集和键空间进行了模拟。都很大,具有不同的稀疏性:
function sparse_probability()
num_keys = logspace(2, 5, 15); % number of keys varies from 1e2 to 1e5
key_spaces = logspace(6, 12, 15); % size of key space varies from 1e6 to 1e12
% so p_sucess varies from 1e-4 to 1e-7
num_experiments = length(num_keys);
results = zeros(1,num_experiments);
proportions = zeros(1,num_experiments);
for i = 1:num_experiments
num_objs = num_keys(i);
size_of_key_space = key_spaces(i);
p_success = num_objs/size_of_key_space;
p_fail = 1 - p_success;
total_fail = 1;
num_trials = 0;
while (total_fail > 0.5)
total_fail = total_fail * p_fail;
num_trials = num_trials + 1;
end
results(i) = num_trials;
proportions(i) = num_trials/(size_of_key_space/(2*num_objs));
fprintf('p_success = %f, num_trials = %d, ratio = %f, num_keys = %e; size key_space = %e\n', 1 - total_fail, num_trials, proportions(i), num_objs, size_of_key_space);
end
由于键集和键空间的大小差异很大,我计算了上面“预计”值的比率,以及达到 50% 概率所需的实际试验次数。上面函数的输出是:
p_success = 0.500044, num_trials = 6932, ratio = 1.386400, num_keys = 1.000000e+02; size key_space = 1.000000e+06
p_success = 0.500010, num_trials = 11353, ratio = 1.386293, num_keys = 1.637894e+02; size key_space = 2.682696e+06
p_success = 0.500006, num_trials = 18595, ratio = 1.386292, num_keys = 2.682696e+02; size key_space = 7.196857e+06
p_success = 0.500008, num_trials = 30457, ratio = 1.386309, num_keys = 4.393971e+02; size key_space = 1.930698e+07
p_success = 0.500004, num_trials = 49885, ratio = 1.386300, num_keys = 7.196857e+02; size key_space = 5.179475e+07
p_success = 0.500001, num_trials = 81706, ratio = 1.386294, num_keys = 1.178769e+03; size key_space = 1.389495e+08
p_success = 0.500001, num_trials = 133826, ratio = 1.386297, num_keys = 1.930698e+03; size key_space = 3.727594e+08
p_success = 0.500002, num_trials = 219193, ratio = 1.386298, num_keys = 3.162278e+03; size key_space = 1.000000e+09
p_success = 0.500001, num_trials = 359014, ratio = 1.386295, num_keys = 5.179475e+03; size key_space = 2.682696e+09
p_success = 0.500001, num_trials = 588027, ratio = 1.386296, num_keys = 8.483429e+03; size key_space = 7.196857e+09
p_success = 0.500000, num_trials = 963125, ratio = 1.386295, num_keys = 1.389495e+04; size key_space = 1.930698e+10
p_success = 0.500000, num_trials = 1577496, ratio = 1.386294, num_keys = 2.275846e+04; size key_space = 5.179475e+10
p_success = 0.500000, num_trials = 2583771, ratio = 1.386294, num_keys = 3.727594e+04; size key_space = 1.389495e+11
p_success = 0.500000, num_trials = 4231943, ratio = 1.386295, num_keys = 6.105402e+04; size key_space = 3.727594e+11
p_success = 0.500000, num_trials = 6931472, ratio = 1.386294, num_keys = 1.000000e+05; size key_space = 1.000000e+12
如果您要绘制比率列与键空间大小的关系,您会得到一条直线。例如,只要密钥集和密钥空间相隔几个数量级,该比率基本上是恒定的。请注意,稀疏度会有所不同,但这不会影响比率。这是这类稀疏概率问题的典型特征。因此,从这个简单的实验中,您可以非常自信地说,2.3e7 键所需的猜测次数,在2^128 = 3.4e38 的键空间中,是高于1.386294 的比率限制与预测值的乘积一共
1.386294 * (2^128 / (2 * 2.3e7)) = 1.02550305123542e+31
猜测有效 UUID 的概率为 50%。
以每秒 1 万亿次的猜测,进行这么多猜测需要 3250 亿年。换句话说,你是安全的。 :)