malemkhoang
Rìu Chiến
UUID là gì?
UUID là viết tắt của Universally Unique IDentifier, hiểu nôm na là một định danh duy nhất trong toàn vũ trụ (universal cơ mà) =)). UUID dùng trong CSDL lớn, có nhiều server, nhiều client cùng lúc truy cập trên toàn thế giới, khả năng bảo mật cao.
Tôi hiểu đơn giản như vậy thôi, không dám múa rìu qua mắt thợ.
Đôi khi tôi cần cái mã này, nằm ngoài CSDL, nhẫu nhiên. Một số ngôn ngữ lập trình đều có ví dụ tạo UUID, nhất là ngôn ngữ kịch bản (script). Tuy nhiên, các ngôn ngữ lập trình đó không cần thiết đối với tôi. Song, từ đó tôi cũng hiểu được cách tạo ra mã UUID. CMD là ngôn ngữ kịch bản mà tôi đã nghĩ đến để thực hiện ý tưởng này. Dĩ nhiên là nó có mức độ hết sức đơn giản. Nhưng tôi chỉ cần có vậy.
Tôi hiểu đơn giản như vậy thôi, không dám múa rìu qua mắt thợ.
Đôi khi tôi cần cái mã này, nằm ngoài CSDL, nhẫu nhiên. Một số ngôn ngữ lập trình đều có ví dụ tạo UUID, nhất là ngôn ngữ kịch bản (script). Tuy nhiên, các ngôn ngữ lập trình đó không cần thiết đối với tôi. Song, từ đó tôi cũng hiểu được cách tạo ra mã UUID. CMD là ngôn ngữ kịch bản mà tôi đã nghĩ đến để thực hiện ý tưởng này. Dĩ nhiên là nó có mức độ hết sức đơn giản. Nhưng tôi chỉ cần có vậy.
Cấu trúc chuỗi UUID:
Một UUID có thể xuất hiện như sau: f81d4fae-7dec-11d0-a765-00a0c91e6bf6 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). Chuỗi này gồm 5 chuỗi con, ghép lại với nhau bằng dấu trừ ("-"), với số lượng ký tự trong mỗi chuỗi con là: 8-4-4-4-12.
Tôi sử dụng cấu trúc chuỗi UUID này với bộ ký tự là: 0123456789abcdefABCDEF.
Tôi có Code cmd để sinh ra chuỗi UUID dạng trên như sau:
Tôi sử dụng cấu trúc chuỗi UUID này với bộ ký tự là: 0123456789abcdefABCDEF.
Tôi có Code cmd để sinh ra chuỗi UUID dạng trên như sau:
Mã:
@echo off
Rem Code tạo UUID giả (pseudo-UUID)
Rem mẫu UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8, 4, 4, 4, 12)
Rem cú pháp: genUUID.cmd hoặc genUUID.cmd > file (để lưu lại kết quả ra tệp)
setlocal enabledelayedexpansion & :: lệnh bắt buộc
:: dùng chú thích tren dòng lệnh phải cẩn thận!!!
Rem không phải dòng lệnh nào cũng chú thích được
:: Hiệu ứng phụ hậu quả khôn lường.
set count=0
Rem lập mảng (pseudo-array) chứa mã thường dùng cho UUID
for %%a in (0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F) do (
set ran_!count!=%%~a
set /a count+=1
)
Rem biến dùng làm chỉ số mảng kết quả
set dem=0
set /a y="%random% %% count" & :: dùng làm chỉ số ngẫu nhiên của mảng chứa mã UUID
call :gen
:kq
echo %u0%%u1%%u2%%u3%%u4%%u5%%u6%%u7%%u8%%u9%%u10%%u11%%u12%%u13%%u14%%u15%%u16%%u17%%u18%%u19%%u20%%u21%%u22%%u23%%u24%%u25%%u26%%u27%%u28%%u29%%u30%%u31%%u32%%u33%%u34%%u35%
:gen
Rem vòng lặp sinh UUID
for %%i in (8,4,4,4,12) do (
for /L %%j in (1,1,%%i) do (
call set u!dem!=%%ran_!y!%%
call :bien
set /a dem+=1
)
if %%j NEQ %%i (
call set u!dem!=-
set /a dem+=1
)
)
:bien
Rem Thủ tục (routin) phát sinh chỉ số ngẫu nhiên của mảng chứa mã UUID
set r=%random%
set /a y="%r% %% count"
Trong đoạn code trên, tôi đã có một vài chú thích. Song cũng giải thích thêm một số lệnh.
1. Setlocal EnableDelayedExpansion:
Phải sử dụng Delayed Expansion, nghĩa là đặt Setlocal EnableDelayedExpansion ở đầu tệp lệnh cmd, khi đó đặt các biến chỉ mục trong ký hiệu phần trăm và đặt các phần tử mảng trong dấu chấm than thì lệnh mới có hiện lực.
Ví dụ: đoạn code đưa ra MH giá trị của biết elem[2]
Mã:
set elem[1]=First element
set elem[2]=Second one
set elem[3]=The third one
set i=2
echo !elem[%i%]
Để nhận giá trị của một phần tử khi chỉ mục thay đổi bên trong FOR / IF, hãy đặt phần tử đó bằng các ký hiệu phần trăm kép và đặt trước lệnh bằng call.
Ví dụ: để di chuyển một dải các phần tử mảng sang bên trái bốn vị trí:
Mã:
for /L %%i in (%start%,1,%end%) do (
set /A j=%%i + 4
call set elem[%%i]=%%elem[!j!]%%
)
Một cách khác để đạt được quy trình trước đó là sử dụng lệnh FOR bổ sung để thay đổi phần mở rộng bị trì hoãn của chỉ mục bằng một tham số có thể thay thế tương đương và sau đó sử dụng phần mở rộng bị trì hoãn cho phần tử mảng. Phương thức này chạy nhanh hơn CALL trước đó.
Ví dụ:
Mã:
for /L %%i in (%start%,1,%end%) do (
set /A j=%%i + 4
for %%j in (!j!) do set elem[%%i]=!elem[%%j]!
)
Lệnh này tôi giải thích ngắn gọn. Chi tiết, mời xem thêm tại:
windows - Mảng, danh sách được liên kết và các cấu trúc dữ liệu khác trong tập lệnh cmd.exe (batch)
Arrays, linked lists and other data structures in cmd.exe (batch) script
I was playing with cmd.exe, but in its help I didn't find any info, how to define arrays. I have found, how to define simple variables: set a=10 echo %a% But, I want to create arrays, linked lis...
stackoverflow.com
2. Mảng (mảng giả) trong CMD:
Không giống như PowerShell, hỗ trợ đầy đủ các mảng. Không có hỗ trợ tích hợp cho các biến mảng trong CMD. Tuy nhiên, có thể sử dụng một loạt các biến riêng biệt, được đặt tên có số thứ tự tuần tự để đại diện cho mảng.
Ví dụ:
Mã:
Set elem[1]=First element
Set elem[2]=Second one
Set elem[3]=The third one
Ví dụ về xây dựng và sau đó đọc một mảng giá trị:
Mã:
Set _folder=c:\pictures
Set _count=1
:: Store each filename in a pseudo-array named like "_pic[0], _pic[1]..."
For /r "%_folder%" %%A in (*.jpg) do (
Set _pic[!_count!]=%%~A
Set /a _count+=1
)
Set /a _count-=1
Echo The number of files is %_count%
Echo:
Echo Now enumerating the array:
For /L %%G in (1,1,%_count%) Do (
Echo Array item _pic[%%G] is !_pic[%%G]!
)
Chi tiết, mời xem thêm tại:
Mảng (mảng giả) - Windows CMD
Lưu ý:
Sử dụng random là yêu cầu nhất thiết để tạo mã UUID. Biến hệ thống %random% trong CMD nhận giá trị ngẫu nhiên trong khoảng từ 0 đến 32767. Nó bị mất hiệu ứng trong vòng lặp nếu sử dụng trực tiếp trong vòng lặp.
Kết luận:
Việc sử dụng, Setlocal EnableDelayedExpansion, mảng (dù là giả lập) và những kỹ thuật khác trong code này có thể mang lại kiến thức và kỹ năng sử dụng các lệnh CMD cho mọi người. Trình độ của tôi về các lệnh CMD thì cũng có hạn thôi. Khi xây dựng code này tôi phải vừa làm vừa đọc tài liệu tham khảo trên Internet, thử đi thử lại nhiều lần mới có kết quả. Chắc chắn code này chưa thể đạt mức độ tối ưu. Song, hy vọng được sử ủng hộ của các bạn.