Tôi đang cố gắng lấy một số khá dài ngẫu nhiên, không thể đoán trước (± 20-25 chữ số) bằng cách sử dụng Javascript (được tạo bởi ứng dụng khách của người dùng) nhanh và nhẹ nhất có thể. Giải pháp này có đáng tin cậy, mạnh mẽ và đủ an toàn không?
Khi trang trực tuyến được mở, dấu thời gian gồm 13 chữ số sẽ được lưu trữ. Bộ đếm thời gian xác định số mili giây trước khi người dùng nhấp vào 'OK' (giả sử anh ta có một đoạn văn bản ngắn để đọc hoặc bất kỳ việc gì khác cần làm). Một bộ sưu tập gồm 100 'pixel' không nhìn thấy được (các khoảng HTML 1*1px) được tạo với các màu RGBA ban đầu được cố định ngẫu nhiên (A=0=độ trong suốt).
hãy để d = Date.now();
đặt n = 100
hãy để pixel = ''
cho (i=0; i<n; i++) {
hãy để r = Math.floor(Math.random() * 256);
hãy để g = Math.floor(Math.random() * 256);
hãy để b = Math.floor(Math.random() * 256);
hãy để c = 'rgba('+r+','+g+','+b+',0)'
pixel += '<span id="pix'+i+'" style="background-color:'+c+'"></span>'
}
Sau khi hoàn thành, chúng tôi thay đổi ngẫu nhiên màu của từng 'pixel' cứ sau 100 giây
hãy để changeColor = setInterval(function(){
cho (i=0; i<n; i++) {
hãy để r = Math.floor(Math.random() * 256);
hãy để g = Math.floor(Math.random() * 256);
hãy để b = Math.floor(Math.random() * 256);
hãy để c = 'rgba('+r+','+g+','+b+',0)'
document.getElementById('pix'+i).style.backgroundColor = c
}
},10);
Khi người dùng nhấp vào 'OK', chức năng sẽ dừng lại, một pixel ngẫu nhiên được xác định và các giá trị RGB của nó được tìm thấy
hãy để x = Math.floor(Math.random() * n);
hãy để px = window.getComputedStyle(document.getElementById('pix'+x),null).backgroundColor
để rgb = px.match(/\d+/g);
Sau đó, chúng tôi nhân mỗi giá trị RGB với x * một hệ số ngẫu nhiên [1 đến 5]:
để r = rgb[0]*(x*Math.floor(Math.random() * 5)+1),
g = rgb[1]*(x*Math.floor(Math.random() * 5)+1),
b = rgb[2]*(x*Math.floor(Math.random() * 5)+1)
Bằng cách thêm x + bộ đếm thời gian + trích xuất ngẫu nhiên dấu thời gian, chúng tôi thu được:
hãy để t = Date.now()-d;
đặt p = Math.floor(Math.random() * 4)+3;
let z = d.toString().substr(-p)
để val = x+''+r+g+b+''+t+z
Sau đó, chúng tôi xáo trộn ngẫu nhiên kết quả:
chức năng xáo trộn (a) {
để r = a.length, temp, rand;
trong khi (0 !== r) {
rand = Math.floor(Math.random() * r);
r -= 1;
tạm thời = a[r];
a[r] = a[rand];
a[rand] = nhiệt độ;
}
trả lại một; // 39136850723712134855601 -> 25851963017738613021534
}
Kiểm tra -> bảng điều khiển
17:22:34 pixel
17:22:42 pixel
17:23:02 pixel
Nếu chúng tôi cần kết quả dài hơn (50, 100 chữ số), chúng tôi có thể tạo 500 'pixel' và chọn ngẫu nhiên 10 trong số chúng thay vì một. Hoặc thêm một giá trị entropy (chuyển động của chuột trên màn hình: https://www.grc.com/r&d/js.htm) đến giá trị thu được. Bạn nghĩ sao?