2010-08-20 44 views
17

Tôi cần tạo các số nguyên 64 bit duy nhất từ ​​Python. Tôi đã kiểm tra số UUID module. Nhưng UUID nó tạo ra là 128 bit số nguyên. Vì vậy, điều đó sẽ không hoạt động.Làm thế nào để tạo ra các số nguyên 64 bit duy nhất từ ​​Python?

Bạn có biết cách nào để tạo 64 bit số nguyên duy nhất trong Python không? Cảm ơn.

+1

Làm thế nào độc đáo làm họ cần phải được? duy nhất cho chương trình đó, hoặc duy nhất cho mọi ID được tạo bởi bất kỳ chương trình nào trên bất kỳ máy tính nào (đó là những gì UUID cung cấp cho bạn)? –

+0

Dave - đây là những ID của tài liệu. Mỗi ID được tạo ra cần phải là duy nhất. Tôi có thể có nhiều máy chủ đều có các quy trình Python. – Continuation

+0

Tại sao không chỉ đơn giản chỉ định số tuần tự? Họ là duy nhất. –

Trả lời

30

chỉ dừng ở việc int 128bit

>>> import uuid 
>>> uuid.uuid4().int & (1<<64)-1 
9518405196747027403L 
>>> uuid.uuid4().int & (1<<64)-1 
12558137269921983654L 

Đây là nhiều hay ít ngẫu nhiên, do đó bạn có một cơ hội nhỏ bé của một vụ va chạm

Có lẽ 64 bit đầu tiên của uuid1 là an toàn hơn để sử dụng

>>> uuid.uuid1().int>>64 
9392468011745350111L 
>>> uuid.uuid1().int>>64 
9407757923520418271L 
>>> uuid.uuid1().int>>64 
9418928317413528031L 

Đây là phần lớn dựa trên đồng hồ, quá ít ngẫu nhiên nhưng tính độc đáo là tốt hơn

+2

uuid1 tiết lộ địa chỉ MAC và thời gian - uuid4 an toàn hơn. –

+3

Dịch chuyển phải bằng 64 bit sẽ xóa địa chỉ MAC và thời gian, chỉ để lại đồng hồ. – Glyph

+0

@LukasCenovsky, uuid1 sẽ có nhiều khả năng là duy nhất chính xác vì lý do đó. Tùy thuộc vào yêu cầu bảo mật hay không, nhưng giao dịch là cho uuid4, các xung đột sẽ có nhiều khả năng là –

14

64 bit độc đáo

Có gì sai với đếm? Một bộ đếm đơn giản sẽ tạo ra các giá trị duy nhất. Đây là cách đơn giản nhất và thật dễ dàng để đảm bảo bạn sẽ không lặp lại một giá trị.

Hoặc, nếu tính không đủ tốt, hãy thử điều này.

>>> import random 
>>> random.getrandbits(64) 
5316191164430650570L 

Tùy thuộc vào cách bạn gieo hạt và sử dụng trình tạo số ngẫu nhiên, phải là duy nhất.

Bạn có thể - tất nhiên - làm điều này không chính xác và nhận được một chuỗi các số ngẫu nhiên lặp lại. Bạn phải cẩn thận với cách bạn xử lý hạt giống cho một chương trình bắt đầu và dừng lại.

+0

Cho dù bạn có khả năng lặp lại bao nhiêu hạt giống sau khoảng 2^32 ID được tạo nếu bạn sử dụng getrandbits() phương pháp. –

+1

Trình tự lý thuyết dài hơn. "Nó tạo ra nổi chính xác 53 bit và có thời gian 2 ** 19937-1." Tại sao getrandbits() không có đủ thời gian? Nó có tạo ra nhiều số không? Ngay cả khi nó tạo ra 64 giá trị riêng biệt và chỉ sử dụng một bit, khoảng thời gian kết quả sẽ là 2^311. –

+0

Hạt giống lớn cỡ nào? Nếu bạn sử dụng cùng một hạt giống, bạn sẽ nhận được cùng một số ngẫu nhiên – dalore

5

Một 64-bit số ngẫu nhiên từ bộ tạo số ngẫu nhiên của hệ điều hành chứ không phải là một PRNG:

>>> from struct import unpack; from os import urandom 
>>> unpack("!Q", urandom(8))[0] 
12494068718269657783L 
Các vấn đề liên quan