Nhờ mọi người giải thích giúp mình ý nghĩa của dòng lệnh này trong JavaScript
Mình đang theo dõi 1 đoạn code, trong đó có đoạn nhỏ này dùng để tạo ra 1 random string:
static createGuid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
}
return s4() + s4() + s4() + s4(); // Example => 'e014026082e6237b'
}
Đọc đến chỗ này mình bí quá ... vì không hiểu được.
Mình có tra Google và có tìm thấy trên Stackoverflow : https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript/105074#105074
Nhưng kỹ năng tiếng anh yếu quá nên không tự tìm hiểu được. Nhờ các bạn giải thích giùm mình với được không. Mình cám ơn mọi người !
3 CÂU TRẢ LỜI
Tên hàm createGuid
có nghĩa là create global unique id, tức ta kỳ vọng vào việc có thể generate ra những id
khác nhau, ở những lần gọi khác nhau.
Hàm s4
, theo mình đoán, thì là hàm generate ra 4 ký tự, thuộc hệ 16 (tức bao gồm 0 - 9
và a, b, c, d, e, f
)
Giải thích từng bước 1 trong hàm s4
thì ta có:
Math.random()
, là random ra một số trong khoảng từ0 <= x < 1
0x10000
là số trong hệ16
. Tính ra sẽ có giá trị là trong hệ 10- Lúc này phép toán
(1 + Math.random()) * 0x10000
sẽ cho ra một kết quả trong đoạn0x10000 <= x < 0x20000
- Dùng thêm hàm
Math.floor()
nữa bạn sẽ có một số nguyên trong khoảng0x10000 <= y <= 0x1ffff
- Đến đây ta convert về string bằng hàm
toString
với base là16
, thì sẽ được một chuỗi trong khoảng10000
và1ffff
- Dùng
substring(1)
để bỏ ký tự đầu tiên đi, kết quả sẽ là một chuỗi gồm 4 ký tự, trong khoảng0000
đếnffff
Lặp lại quá trình gọi hàm s4()
này 4 lần, bạn sẽ có chuỗi 16 ký tự, các ký tự nằm trong khoảng từ 0
đến f
của hệ 16.
Khả năng bị trùng lặp sẽ rơi vào , tức cự kỳ nhỏ =))
Xin cám ơn mọi người nhiều ạ
Bạn @thangtd90 cho mình hỏi đoạn này:
Lúc này phép toán (1 + Math.random()) * 0x10000 sẽ cho ra một kết quả trong đoạn 0x10000 <= x < 0x20000
Dùng thêm hàm Math.floor() nữa bạn sẽ có một số nguyên trong khoảng 0x10000 <= y <= 0x1ffff
Sao đang từ : 0x10000 <= x < 0x20000 qua hàm Math.floor() lại ra được ==> 0x10000 <= y <= 0x1ffff tại sao từ 20000 chuyển thành 1ffff bằng cách nào vậy bạn?
Vì 0x1ffff
là số nguyên liền trước của 0x20000
.
x < 0x20000
nên y = floor(x) <= 0x1ffff
đó bạn
@wiliamfeng Bạn chú ý đây đang là tính toán ở hệ 16
nhé
Như bạn @quocnb nói thì 0x1ffff
chính là số nguyên liền trước của 0x20000
đấy.
@wiliamfeng Bạn mở console của Google Chrome lên chẳng hạn, xong gõ vào sẽ thấy 0x20000
có giá trị là 131072
, còn 0x1ffff
có giá trị là 131071
.
Cụ thể thì
0x20000
0x1ffff
Cám ơn @thangtd90 và @quocnb , nói : 0x1ffff chính là số nguyên liền trước của 0x20000
là mình hiểu liền rồi.
Bên dưới bạn @thangtd90 còn giải thích kỹ hơn:
Mình lại được bổ sung thêm kiến thức nữa. Mình cám ơn b nhé
Đoạn này cũng dễ hiểu mà, đơn giản là nó tạo ra một chuỗi ký tự ngẫu nhiên có độ dài 16 ký tự, theo quy tắc:
- Tạo ra 4 chuỗi
s4
- Để tạo ra chuỗi 4 ký tự: Tạo ra một số ngẫu nhiên, rồi +1 đơn vị.
- Tiếp theo, nhân số đấy với 2^16 = 65,536 = 0x10000 (hexa).
- Làm tròn tích thành số nguyên rồi chuyền về dạng hexa string:
toString(16)
. Do 2^16 hệ hexa là 10000, có 5 ký tự nên tích của một số với 10000 chắc chắn có hơn 5 ký tự, sau khi chuyển về hexa, cắt bỏ ký tự đầu tiên.
- Nối 4 chuỗi ở bước 1 với nhau để tạo ra chuỗi 16 ký tự.
Math.random() // đây là phép toán lấy 1 số random. 0x10000 = 65536 // các số bắt đầu bằng 0x là dạng số thập lục (hex). toString(16) // convert số vừa được làm tròn lên bằng hàm floor sang dạng hexa. substring(1) // cắt đi ký tự đầu tiên. còn việc viết function trong 1 function thì được gọi là closure functionày trong javascript, bạn có thể tự search từ khóa này