Tính Toán Chu Vi Ướt Cho Hình Dạng Kênh Khác Nhau
Tính toán chu vi ướt cho các hình dạng kênh khác nhau bao gồm hình thang, hình chữ nhật/hình vuông và ống tròn. Cần thiết cho các ứng dụng kỹ thuật thủy lực và cơ học chất lỏng.
Trình tạo ULID
ULID đã tạo:
Cấu trúc ULID
Dấu thời gian (10 ký tự)
Tính ngẫu nhiên (16 ký tự)
Tài liệu
Trình tạo ULID
Giới thiệu
ULID (Universally Unique Lexicographically Sortable Identifier) là một định danh duy nhất kết hợp giữa một dấu thời gian và dữ liệu ngẫu nhiên để tạo ra một chuỗi 26 ký tự. ULID được thiết kế để có thể sắp xếp theo thứ tự từ điển trong khi vẫn duy trì mức độ duy nhất và ngẫu nhiên cao.
Cấu trúc của một ULID
Một ULID bao gồm hai phần chính:
- Dấu thời gian (10 ký tự): 10 ký tự đầu tiên đại diện cho thời gian tính bằng mili giây kể từ Epoch Unix (1970-01-01).
- Tính ngẫu nhiên (16 ký tự): 16 ký tự còn lại được tạo ra bằng dữ liệu ngẫu nhiên an toàn về mặt mật mã.
Chuỗi 26 ký tự kết quả được mã hóa bằng cách sử dụng bảng chữ cái base32 của Crockford (0-9 và A-Z, không bao gồm I, L, O và U).
Công thức
ULID được tạo ra bằng cách thực hiện các bước sau:
- Tạo một dấu thời gian 48-bit (mili giây kể từ Epoch Unix).
- Tạo 80 bit dữ liệu ngẫu nhiên an toàn về mặt mật mã.
- Mã hóa 128 bit kết hợp bằng cách sử dụng mã hóa base32 của Crockford.
Tính toán
Trình tạo ULID thực hiện các bước sau:
- Lấy dấu thời gian hiện tại tính bằng mili giây.
- Tạo 10 byte ngẫu nhiên (80 bit) bằng cách sử dụng bộ sinh số ngẫu nhiên an toàn về mặt mật mã.
- Kết hợp dấu thời gian và dữ liệu ngẫu nhiên thành một số nguyên 128-bit.
- Mã hóa số nguyên 128-bit bằng cách sử dụng mã hóa base32 của Crockford.
Các trường hợp sử dụng
ULID hữu ích trong nhiều tình huống, bao gồm:
- Khóa cơ sở dữ liệu: ULID có thể được sử dụng làm định danh duy nhất cho các bản ghi cơ sở dữ liệu, đảm bảo tính duy nhất và có thể sắp xếp.
- Hệ thống phân tán: Trong các môi trường phân tán, ULID có thể được tạo ra mà không cần phối hợp giữa các nút.
- Ghi log và theo dõi: ULID có thể được sử dụng để gán nhãn cho các mục log hoặc theo dõi các sự kiện, cung cấp một định danh duy nhất và có thể sắp xếp.
- ID thân thiện với URL: ULID an toàn cho URL và có thể được sử dụng trong các ứng dụng web như các định danh trong URL.
Các lựa chọn thay thế
Mặc dù ULID rất linh hoạt, nhưng còn có các hệ thống định danh duy nhất khác để xem xét:
- UUID (Universally Unique Identifier): Một định danh 128-bit không bao gồm thành phần dấu thời gian.
- KSUID (K-Sortable Unique IDentifier): Tương tự như ULID nhưng với mã hóa dấu thời gian khác.
- Snowflake ID: Hệ thống tạo ID duy nhất phân tán của Twitter, bao gồm một dấu thời gian và ID của máy chủ.
Lịch sử
ULID được giới thiệu vào năm 2016 bởi Alizain Feerasta như một lựa chọn thay thế cho UUID. Chúng được thiết kế để giải quyết một số hạn chế của UUID, đặc biệt là về khả năng sắp xếp và khả năng đọc. Đặc tả ULID đã giữ ổn định kể từ khi được giới thiệu, với nhiều triển khai có sẵn trong các ngôn ngữ lập trình khác nhau.
Ví dụ
Dưới đây là một số ví dụ mã để tạo ULID trong các ngôn ngữ lập trình khác nhau:
1// Triển khai JavaScript
2function generateULID() {
3 const timestamp = Date.now().toString(36).padStart(10, '0');
4 const randomness = crypto.getRandomValues(new Uint8Array(16))
5 .reduce((acc, byte) => acc + byte.toString(36).padStart(2, '0'), '');
6 return (timestamp + randomness).toUpperCase();
7}
8
9console.log(generateULID());
10
1## Triển khai Python
2import time
3import secrets
4import base64
5
6def generate_ulid():
7 timestamp = int(time.time() * 1000).to_bytes(6, byteorder="big")
8 randomness = secrets.token_bytes(10)
9 return base64.b32encode(timestamp + randomness).decode("ascii").lower()
10
11print(generate_ulid())
12
1// Triển khai Java
2import java.security.SecureRandom;
3import java.time.Instant;
4
5public class ULIDGenerator {
6 private static final SecureRandom random = new SecureRandom();
7 private static final char[] ENCODING_CHARS = "0123456789ABCDEFGHJKMNPQRSTVWXYZ".toCharArray();
8
9 public static String generateULID() {
10 long timestamp = Instant.now().toEpochMilli();
11 byte[] randomness = new byte[10];
12 random.nextBytes(randomness);
13
14 StringBuilder result = new StringBuilder();
15 // Mã hóa dấu thời gian
16 for (int i = 9; i >= 0; i--) {
17 result.append(ENCODING_CHARS[(int) (timestamp % 32)]);
18 timestamp /= 32;
19 }
20 // Mã hóa tính ngẫu nhiên
21 for (byte b : randomness) {
22 result.append(ENCODING_CHARS[b & 31]);
23 }
24 return result.toString();
25 }
26
27 public static void main(String[] args) {
28 System.out.println(generateULID());
29 }
30}
31
Những ví dụ này minh họa cách tạo ULID trong JavaScript, Python và Java. Bạn có thể điều chỉnh các hàm này theo nhu cầu cụ thể của mình hoặc tích hợp chúng vào các hệ thống lớn hơn yêu cầu các định danh duy nhất.
Tài liệu tham khảo
- "Đặc tả ULID." GitHub, https://github.com/ulid/spec. Truy cập ngày 2 tháng 8 năm 2024.
- "Mã hóa base32 của Crockford." Mã hóa Base32, http://www.crockford.com/base32.html. Truy cập ngày 2 tháng 8 năm 2024.
- "UUID so với ULID." Stack Overflow, https://stackoverflow.com/questions/54222235/uuid-vs-ulid. Truy cập ngày 2 tháng 8 năm 2024.
Phản hồi
Nhấp vào thông báo phản hồi để bắt đầu gửi phản hồi về công cụ này
Công cụ liên quan
Khám phá thêm các công cụ có thể hữu ích cho quy trình làm việc của bạn