Die anderen Antworten haben erklärt, warum Sie die Berechnungen, die Sie wollen, nicht mit der Verschiedenheit der von Ihnen verwendeten Zahlen durchführen können. Wie ich in einem Kommentar erwähnt habe, können Sie jedoch mit kleineren Zahlen experimentieren, um einen Trend zu zeigen. Nennen wir den "projizierten" Wert size_of_key_space/(2 * number_of_keys)
. Dies ist eine Art naiv erwarteter Wert für eine 50% ige Erfolgswahrscheinlichkeit. Um dies zu beweisen, habe ich eine Simulation für eine Reihe verschiedener Schlüsselsätze und Schlüsselräume durchgeführt. Alle sind groß, mit unterschiedlichen sparsity:
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
Da den Größen des Schlüsselsatzes und Schlüsselraum erheblich variieren, berechne ich das Verhältnis der „projizierte“ Wert über, und die tatsächliche Anzahl der Versuche benötigten 50 zu erreichen % Wahrscheinlichkeit. Der Ausgang der Funktion oben ist:
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
Wenn Sie das Verhältnis Spalt im Vergleich zu der Größe des Schlüsselraumes zu zeichnen, würden Sie eine gerade Linie zu bekommen. Wie im Fall ist das Verhältnis im Wesentlichen konstant, solange der Schlüsselsatz und der Schlüsselraum mehrere Größenordnungen voneinander entfernt sind. Beachten Sie, dass die Sparsity variiert, aber das Verhältnis nicht beeinflusst. Dies ist typisch für diese Arten von spärlichen Wahrscheinlichkeitsproblemen.Aus diesem einfachen Experiment können Sie also mit SEHR hoher Wahrscheinlichkeit sagen, dass die Anzahl der benötigten Schlüssel mit 2.3e7
Schlüsseln in einem Schlüsselraum von 2^128 = 3.4e38
das Produkt der Verhältnisgrenze über 1.386294
mit dem projizierten Wert für eine Gesamtsumme von
ist
1.386294 * (2^128/(2 * 2.3e7)) = 1.02550305123542e+31
Schätzungen erforderlich für eine 50% ige Chance, eine gültige UUID zu erraten.
Bei 1 Billion raten Sie eine Sekunde, würde es 325 Milliarden Jahre dauern, um so viele Vermutungen zu nehmen. Mit anderen Worten, du bist in Sicherheit. :)
weil '2.3e7 << 2^128 (3.4E38)', eine vernünftige Annäherung für Ihre Antwort '3.4E38/(2.3e7 * 2)' ~ = 7.39e30.Sie können dies im Prinzip mit viel kleineren Zahlen testen, die MATLAB verarbeiten kann (wenn Sie keinen Zugriff auf Symbolic Toolbox haben). Auch andere Sprachen können dies mit freien Bibliotheken (wie Python) umgehen. – gariepy
eher gut, danke ... – bla