Tôi cần tạo một ID duy nhất dựa trên giá trị ngẫu nhiên.Làm cách nào để tạo ID duy nhất bằng Python?
Trả lời
Có lẽ uuid.uuid4()
có thể thực hiện công việc. Xem uuid để biết thêm thông tin.
Xem ra, thư viện nằm bên dưới mô-đun đó là lỗi và có xu hướng nới lỏng một quy trình giữ FDs mở. Đó là cố định trong các phiên bản mới hơn, nhưng hầu hết mọi người có lẽ chưa có, vì vậy tôi thường tránh mô-đun này. Gây cho tôi đau đầu lớn với ổ cắm nghe ... –
@Glenn: Bất kỳ chi tiết nào khác về phiên bản nào bị lỗi? Tôi đang sử dụng mã này trong mã sản xuất (và sắp triển khai để sử dụng nhiều hơn trong phiên bản mới hơn). Giờ tôi sợ rồi! –
@Matthew: Tôi không biết nếu nó đã được sửa chưa, nhưng phần phụ uuid sử dụng uuidlib phân chia mà không đóng FD, vì vậy các ổ cắm TCP tôi đã mở lúc đó sẽ không bao giờ bị đóng và tôi không thể mở lại cổng sau . Tôi sẽ phải tự tay 'uuidd' làm root. Tôi đã làm việc xung quanh vấn đề này bằng cách đặt 'uuid._uuid_generate_time' và' uuid._uuid_generate_random' thành None để mô-đun 'uuid' không bao giờ sử dụng cài đặt gốc. (Điều đó thực sự nên là một lựa chọn anyway; tạo UUID ngẫu nhiên V4 gây ra một daemon để được bắt đầu là hoàn toàn không cần thiết.) –
Bạn có thể muốn chức năng UUID của Python:
21.15. uuid — UUID objects according to RFC 4122
ví dụ:
import uuid
print uuid.uuid4()
7d529dd4-548b-4258-aa8e-23e34dc8d43d
lẽ module uuid ?
import time
def new_id():
time.sleep(0.000001)
return time.time()
Trên hệ thống, time.time() dường như cung cấp 6 số liệu quan trọng sau dấu thập phân. Với một giấc ngủ ngắn, nó sẽ được đảm bảo duy nhất với ít nhất một lượng vừa phải ngẫu nhiên xuống trong hai hoặc ba chữ số cuối cùng.
Bạn cũng có thể băm nó nếu bạn lo lắng.
Hashing nó sẽ không làm cho nó độc đáo hơn, và có một cơ hội mạnh mẽ của một vụ va chạm cuối cùng nếu nhiều hơn một quá trình đang làm điều này - bất cứ nơi nào, thậm chí không chỉ trên cùng một máy. Đây không phải là cách để tạo ra các ID unque. –
Hashing sẽ ngăn mọi người đoán bằng cách tăng dần. Nó sẽ là duy nhất nếu chỉ có một sợi chỉ ra ID, tôi nghĩ vậy. Rất nhiều phụ thuộc vào những gì các ID là _for_. (và tại sao họ phải là cả hai độc đáo và ngẫu nhiên) –
độc đáo và ngẫu nhiên loại trừ lẫn nhau. có lẽ bạn muốn điều này?
import random
def uniqueid():
seed = random.getrandbits(32)
while True:
yield seed
seed += 1
Cách sử dụng:
unique_sequence = uniqueid()
id1 = next(unique_sequence)
id2 = next(unique_sequence)
id3 = next(unique_sequence)
ids = list(itertools.islice(unique_sequence, 1000))
không có hai trở id là như nhau (Unique) và điều này được dựa trên một giá trị hạt giống ngẫu nhiên
Đây không phải là duy nhất. Nếu tôi bắt đầu nó hai lần, và tạo ra một triệu giá trị mỗi lần, khả năng xảy ra xung đột giữa hai lần chạy là đáng kể. Tôi phải cất giữ "hạt giống" cuối cùng mỗi lần để tránh điều đó - và thế thì không có điểm nào để có hạt giống; nó chỉ là một trình tạo chuỗi. * Theo thống kê * các ID duy nhất thường được tạo từ dữ liệu ngẫu nhiên; ít nhất một lớp UUID hoạt động theo cách đó. –
Nó là duy nhất miễn là mỗi chuỗi duy nhất đến từ chỉ một lời gọi duy nhất của uniqueid. không có sự đảm bảo về tính duy nhất giữa các máy phát điện. – SingleNegationElimination
Với điều kiện đó, ngay cả bộ đếm cũng là duy nhất. –
import time
import random
import socket
import hashlib
def guid(*args):
"""
Generates a universally unique ID.
Any arguments only create more randomness.
"""
t = long(time.time() * 1000)
r = long(random.random()*100000000000000000L)
try:
a = socket.gethostbyname(socket.gethostname())
except:
# if we can't get a network address, just imagine one
a = random.random()*100000000000000000L
data = str(t)+' '+str(r)+' '+str(a)+' '+str(args)
data = hashlib.md5(data).hexdigest()
return data
đây bạn có thể tìm thấy một thực hiện:
def __uniqueid__():
"""
generate unique id with length 17 to 21.
ensure uniqueness even with daylight savings events (clocks adjusted one-hour backward).
if you generate 1 million ids per second during 100 years, you will generate
2*25 (approx sec per year) * 10**6 (1 million id per sec) * 100 (years) = 5 * 10**9 unique ids.
with 17 digits (radix 16) id, you can represent 16**17 = 295147905179352825856 ids (around 2.9 * 10**20).
In fact, as we need far less than that, we agree that the format used to represent id (seed + timestamp reversed)
do not cover all numbers that could be represented with 35 digits (radix 16).
if you generate 1 million id per second with this algorithm, it will increase the seed by less than 2**12 per hour
so if a DST occurs and backward one hour, we need to ensure to generate unique id for twice times for the same period.
the seed must be at least 1 to 2**13 range. if we want to ensure uniqueness for two hours (100% contingency), we need
a seed for 1 to 2**14 range. that's what we have with this algorithm. You have to increment seed_range_bits if you
move your machine by airplane to another time zone or if you have a glucky wallet and use a computer that can generate
more than 1 million ids per second.
one word about predictability : This algorithm is absolutely NOT designed to generate unpredictable unique id.
you can add a sha-1 or sha-256 digest step at the end of this algorithm but you will loose uniqueness and enter to collision probability world.
hash algorithms ensure that for same id generated here, you will have the same hash but for two differents id (a pair of ids), it is
possible to have the same hash with a very little probability. You would certainly take an option on a bijective function that maps
35 digits (or more) number to 35 digits (or more) number based on cipher block and secret key. read paper on breaking PRNG algorithms
in order to be convinced that problems could occur as soon as you use random library :)
1 million id per second ?... on a Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz, you get :
>>> timeit.timeit(uniqueid,number=40000)
1.0114529132843018
an average of 40000 id/second
"""
mynow=datetime.now
sft=datetime.strftime
# store old datetime each time in order to check if we generate during same microsecond (glucky wallet !)
# or if daylight savings event occurs (when clocks are adjusted backward) [rarely detected at this level]
old_time=mynow() # fake init - on very speed machine it could increase your seed to seed + 1... but we have our contingency :)
# manage seed
seed_range_bits=14 # max range for seed
seed_max_value=2**seed_range_bits - 1 # seed could not exceed 2**nbbits - 1
# get random seed
seed=random.getrandbits(seed_range_bits)
current_seed=str(seed)
# producing new ids
while True:
# get current time
current_time=mynow()
if current_time <= old_time:
# previous id generated in the same microsecond or Daylight saving time event occurs (when clocks are adjusted backward)
seed = max(1,(seed + 1) % seed_max_value)
current_seed=str(seed)
# generate new id (concatenate seed and timestamp as numbers)
#newid=hex(int(''.join([sft(current_time,'%f%S%M%H%d%m%Y'),current_seed])))[2:-1]
newid=int(''.join([sft(current_time,'%f%S%M%H%d%m%Y'),current_seed]))
# save current time
old_time=current_time
# return a new id
yield newid
""" you get a new id for each call of uniqueid() """
uniqueid=__uniqueid__().next
import unittest
class UniqueIdTest(unittest.TestCase):
def testGen(self):
for _ in range(3):
m=[uniqueid() for _ in range(10)]
self.assertEqual(len(m),len(set(m)),"duplicates found !")
hy vọng nó sẽ giúp !
nó thực sự hữu ích cho tôi cảm ơn bạn – Virbhadrasinh
này sẽ làm việc rất nhanh chóng nhưng sẽ không tạo ra giá trị ngẫu nhiên nhưng những người tăng đều đều (đối với một chủ đề nhất định).
import threading
_uid = threading.local()
def genuid():
if getattr(_uid, "uid", None) is None:
_uid.tid = threading.current_thread().ident
_uid.uid = 0
_uid.uid += 1
return (_uid.tid, _uid.uid)
Nó là an toàn và làm việc với các bộ có thể có lợi ích như trái ngược với chuỗi ren (ngắn hơn nếu bất cứ điều gì). Nếu bạn không cần an toàn chủ đề, hãy loại bỏ các bit luồng (thay vì threading.local, sử dụng đối tượng() và xóa tid hoàn toàn).
Hy vọng điều đó sẽ hữu ích.
- 1. Làm cách nào để tạo ID duy nhất thân thiện với con người bằng Python?
- 2. Làm cách nào để tạo id duy nhất trong MySQL?
- 3. Tạo ID duy nhất
- 4. Cách tạo id duy nhất trong Dart
- 5. Tạo một id duy nhất
- 6. Cassandra: Tạo một ID duy nhất?
- 7. Tạo một ID duy nhất trong PHP
- 8. tạo các id duy nhất trong hive
- 9. Tạo ID duy nhất trong C++
- 10. Làm cách nào để tạo ID duy nhất trên toàn hệ thống trong Linux
- 11. Làm cách nào để tạo ID duy nhất cho tài liệu được nhúng trong MongoDB?
- 12. Làm cách nào để tạo ID duy nhất trong mẫu tiện ích con Dojo?
- 13. Cách tạo Long duy nhất bằng UUID
- 14. Cách tạo ID phiên duy nhất trong php
- 15. Cách tạo ID yêu cầu duy nhất trong Rails?
- 16. Cách tạo id đối tượng duy nhất trong mongodb
- 17. Làm thế nào để tạo ID nguyên duy nhất ngẫu nhiên cho khóa chính cho bảng?
- 18. Cách tạo khóa duy nhất cho từ điển trong Python
- 19. Cách tốt nhất để tạo id duy nhất phía máy khách (với Javascript)
- 20. Tạo ID duy nhất ngắn PHP bằng cách sử dụng auto_increment?
- 21. Tạo ID duy nhất cho một máy tính cụ thể
- 22. Nhận id email duy nhất bằng IMAP trong PHP
- 23. Cách lấy giá trị lớn nhất của cột id duy nhất bằng cách sử dụng LINQ
- 24. Nhận id tệp duy nhất trong Windows bằng Java?
- 25. Tăng số ID duy nhất trong hàm tạo
- 26. Làm cách nào để hạn chế quyền dựa trên ID trang duy nhất trong URL?
- 27. Tạo ID duy nhất từ chuỗi chữ và số
- 28. Tạo ID duy nhất cho đối tượng python dựa trên các thuộc tính của nó
- 29. Tạo id duy nhất trong django từ trường mô hình
- 30. Làm cách nào để liên kết các xác nhận với ID duy nhất?
Bạn có thể cụ thể hơn về loại id duy nhất không. Nó có cần phải là một con số không? hoặc nó có thể chứa chữ cái không? Đưa ra một số ví dụ về loại id. – MitMaro
Có thể có liên quan, tất cả các đối tượng có một id duy nhất 'id (my_object)', hoặc 'id (self)'.Đó là đủ cho tôi xem xét tất cả mọi thứ đó là trong python là một đối tượng và có một id số; string: 'id ('Hello World')' classes: 'id ('Hello World')', mọi thứ đều có id. – ThorSummoner
Thực ra tôi đã gặp rắc rối với việc sử dụng id, nó dường như có một số mối quan hệ với tên biến, trong đó các biến có cùng tên đã nhận được id giống với biến vừa được thay thế. Có lẽ tránh sử dụng id trừ khi bạn có thử nghiệm đơn vị tốt và chắc chắn nó hoạt động theo cách bạn muốn nó. – ThorSummoner