Yêu cầu thg 7 6, 2018 2:57 SA 2284 1 3
  • 2284 1 3
0

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

Chia sẻ
  • 2284 1 3

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


Đã trả lời thg 7 6, 2018 3:48 SA
Đã được chấp nhận
+11

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 - 9a, 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à 164=6553616 ^ 4 = 65536 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ạ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
  • Đế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ảng 100001ffff
  • 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ảng 0000 đến ffff

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 1655364\frac{1}{65536 ^ 4} , tức cự kỳ nhỏ =))

Chia sẻ
Avatar Hoang vn @wiliamfeng
thg 7 6, 2018 4:26 SA

Xin cám ơn mọi người nhiều ạ

Avatar Hoang vn @wiliamfeng
thg 7 6, 2018 4:49 SA

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?

thg 7 6, 2018 5:38 SA

@wiliamfeng

0x1ffff là số nguyên liền trước của 0x20000.

x < 0x20000 nên y = floor(x) <= 0x1ffff đó bạn

Avatar Tran Duc Thang @thangtd90
thg 7 6, 2018 6:17 SA

@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.

Avatar Tran Duc Thang @thangtd90
thg 7 6, 2018 6:22 SA

@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.

hexa

Cụ thể thì

0x20000 =2164=131072= 2 * 16 ^ 4 = 131072

0x1ffff =164+15163+15162+15161+15160=131071= 16 ^ 4 + 15 * 16 ^ 3 + 15 * 16 ^ 2 + 15 * 16 ^ 1 + 15 * 16 ^ 0 = 131071

Avatar Hoang vn @wiliamfeng
thg 7 6, 2018 6:45 SA

Cám ơn @thangtd90@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:

Capture.PNG

Mình lại được bổ sung thêm kiến thức nữa. Mình cám ơn b nhé 😃

Đã trả lời thg 7 6, 2018 3:19 SA
+3

Đ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:

  1. 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.
  1. Nối 4 chuỗi ở bước 1 với nhau để tạo ra chuỗi 16 ký tự.
Chia sẻ
Đã trả lời thg 7 6, 2018 3:30 SA
+3

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

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí