2015-10-06 24 views

Trả lời

10

Tôi đã dành nhiều thời gian tìm kiếm giải pháp và đã đưa ra chức năng mysql sau đây tạo ra một UUID ngẫu nhiên (tức là UUIDv4) sử dụng các hàm chuẩn của MySQL . Tôi đang trả lời câu hỏi của riêng tôi để chia sẻ với hy vọng rằng nó sẽ là hữu ích.

-- Change delimiter so that the function body doesn't end the function declaration 
DELIMITER // 

CREATE FUNCTION uuid_v4() 
    RETURNS CHAR(36) 
BEGIN 
    -- Generate 8 2-byte strings that we will combine into a UUIDv4 
    SET @h1 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h2 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h3 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h6 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h7 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 
    SET @h8 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'); 

    -- 4th section will start with a 4 indicating the version 
    SET @h4 = CONCAT('4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0')); 

    -- 5th section first half-byte can only be 8, 9 A or B 
    SET @h5 = CONCAT(HEX(FLOOR(RAND() * 4 + 8)), 
       LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0')); 

    -- Build the complete UUID 
    RETURN LOWER(CONCAT(
     @h1, @h2, '-', @h3, '-', @h4, '-', @h5, '-', @h6, @h7, @h8 
    )); 
END 
// 
-- Switch back the delimiter 
DELIMITER ; 

Lưu ý: Các hệ số giả ngẫu nhiên được sử dụng (MySQL của RAND) không phải là mã hóa an toàn và do đó có một số sai lệch có thể làm tăng sự va chạm rủi ro.

Các vấn đề liên quan