পাইথনে আমি কখন uuid.uuid1 () বনাম uuid.uuid4 () ব্যবহার করব?


207

আমি ডক্স থেকে দুজনের মধ্যে পার্থক্য বুঝতে পারি

uuid1():
হোস্ট আইডি, সিকোয়েন্স নম্বর এবং বর্তমান সময় থেকে একটি ইউইউডি তৈরি করুন

uuid4():
একটি এলোমেলো ইউইউডি জেনারেট করুন।

সুতরাং uuid1একটি ইউইউডি তৈরির জন্য মেশিন / সিকোয়েন্স / সময় তথ্য ব্যবহার করে। প্রতিটি ব্যবহার করার পক্ষে কি কি?

আমি জানি uuid1()গোপনীয়তা সংক্রান্ত উদ্বেগ থাকতে পারে, কারণ এটি মেশিন-তথ্যের ভিত্তিতে রয়েছে। আমি ভাবছি যে একটি বা অন্যটি বেছে নেওয়ার সময় আরও সূক্ষ্ম আছে কি না। আমি এখনই ব্যবহার করি uuid4(), কারণ এটি সম্পূর্ণরূপে এলোমেলো ইউআইইডি। তবে আমি ভাবছি যে আমার uuid1সংঘর্ষের ঝুঁকি হ্রাস করার জন্য ব্যবহার করা উচিত ।

মূলত, আমি একটি বনাম অন্যটি ব্যবহারের সর্বোত্তম-অনুশীলনের জন্য মানুষের টিপস সন্ধান করছি। ধন্যবাদ!


3
ইউইউডি-র বিকল্প পদ্ধতি এখানে। যদিও সংঘর্ষের সুযোগ অসীম হলেও ইউইউডি স্বাতন্ত্র্যের গ্যারান্টি দেয় না। স্বতন্ত্রতার গ্যারান্টি দিতে আপনি [<সিস্টেম আইডি>, <স্থানীয় আইডি>] হিসাবে যৌগিক কীটি ব্যবহার করতে চাইতে পারেন। ডেটা ভাগ করে নেওয়ার ক্ষেত্রে অংশ নেওয়া প্রতিটি সিস্টেমের সিস্টেমের নিজস্ব অনন্য আইডি অবশ্যই সিস্টেম সেট আপ করার সময় নির্ধারিত হতে হবে বা আইডিগুলির একটি সাধারণ পুল থেকে নেওয়া উচিত। স্থানীয় আইডি কোনও নির্দিষ্ট সিস্টেমের মধ্যে একটি অনন্য আইডি। এতে আরও ঝামেলা জড়িত তবে স্বতন্ত্রতার গ্যারান্টি দেয়। অফটোপিকের জন্য দুঃখিত, সাহায্য করার চেষ্টা করছি।
oᴉɹǝɥɔ

3
তিনি উল্লিখিত "গোপনীয়তা সংক্রান্ত উদ্বেগগুলির" যত্ন
নিচ্ছেন না

উত্তর:


253

uuid1()কোনও সংঘর্ষ না ঘটানোর গ্যারান্টিযুক্ত (অনুমানের অধীনে আপনি একই সময়ে তাদের মধ্যে অনেকগুলি তৈরি করেন না)। uuidম্যাক অ্যাড্রেসটি কম্পিউটারে এটি অনন্য করার জন্য ব্যবহৃত হওয়ায় এটি গুরুত্বপূর্ণ যে কম্পিউটার এবং কম্পিউটারের মধ্যে কোনও সংযোগ নেই সে বিষয়ে আমি এটি ব্যবহার করব না ।

আপনি 100ns এরও কম 2 2 ইউয়েড 1 তৈরি করে সদৃশ তৈরি করতে পারেন তবে বেশিরভাগ ক্ষেত্রে ব্যবহারের ক্ষেত্রে এটি কোনও সমস্যা নয়।

uuid4()যেমনটি আপনি বলেছেন, উত্সাহিত করে একটি এলোমেলো ইউআইইডি। সংঘর্ষের সুযোগটি সত্যই, সত্যই, সত্যই ছোট। যথেষ্ট ছোট, এটি সম্পর্কে আপনার চিন্তা করা উচিত নয়। সমস্যাটি হ'ল, একটি খারাপ এলোমেলো সংখ্যা জেনারেটর এটির সংঘর্ষের সম্ভাবনা বেশি করে তোলে।

বব আমানের এই দুর্দান্ত উত্তরটি এটি সুন্দরভাবে বোধ করে। (আমি পুরো উত্তরটি পড়ার পরামর্শ দিচ্ছি।)

সত্যই, দূষিত অভিনেতাদের ছাড়াই একটি অ্যাপ্লিকেশন স্পেসে, পৃথিবীর সমস্ত জীবন বিলুপ্তির ঘটনা আপনার সংঘর্ষের অনেক আগেই ঘটবে, এমনকি একটি সংস্করণ 4 ইউআইইউডে, এমনকি আপনি যদি প্রতি সেকেন্ডে বেশ কয়েকটি ইউআইডি তৈরি করছেন।


দুঃখিত, আমি সম্পূর্ণ গবেষণা না করে মন্তব্য করেছি - সংস্করণ 1 uuid এর সাথে সংঘর্ষ হওয়া থেকে 4 সংস্করণ uuid রাখার জন্য বিটগুলি সংরক্ষিত আছে। আমি আমার মূল মন্তব্যটি সরিয়ে ফেলব। টুলস.ইএইটিএফ.আর.এইচটিএমএল
মার্ক

1
@ জিএস হ্যাঁ, আমি যা পড়ছিলাম তা বোঝায় sense uuid1 "আরও অনন্য", যখন uuid4 আরও বেনামে। সুতরাং আপনার যদি না করার কারণ না থাকে তবে মূলত uuid1 ব্যবহার করুন। @মার্কাম মুক্তিপণ: আমি uuid1 / uuid4 অনুসন্ধান করার সময় দুর্দান্ত উত্তর আসে না, সোজা ঘোড়ার মুখ থেকে, মনে হচ্ছে।
রকেটমনকিগুলি

6
uuid1আপনি যদি একই নোডে প্রতি সেকেন্ডে বেশ কয়েকটি উত্পাদন করেন তবে অগত্যা অনন্য ইউআইডিগুলি তৈরি করবে না। উদাহরণ: [uuid.uuid1() for i in range(2)]। অবশ্যই অদ্ভুত কিছু চলছে যা আমি মিস করছি।
মাইকেল মায়ার

1
@ মিশেল: uuid1একটি সিকোয়েন্স নম্বর রয়েছে (আপনার উদাহরণে চতুর্থ উপাদান), সুতরাং যদি আপনি কাউন্টারে সমস্ত বিট ব্যবহার না করেন তবে আপনার কোনও সংঘর্ষ হবে না।
জর্জি স্কলি

3
@ মিশেল: আমি যখন সংঘর্ষের ঘটনা ঘটে তখন পরিস্থিতিগুলি নিয়ে গবেষণা করার চেষ্টা করেছি এবং আমার পাওয়া তথ্য যুক্ত করেছি।
জর্জি শ্ললি

32

এক উদাহরণ হিসেবে বলা যায় যখন আপনি বিবেচনা করতে পারে uuid1()বদলে uuid4()হয় যখন UUID জানা পৃথক মেশিনে উত্পাদিত হয় , উদাহরণস্বরূপ একাধিক অনলাইন লেনদেনের উদ্দেশ্যে স্কেলিং জন্য বিভিন্ন মেশিনে প্রক্রিয়া যখন।

এ জাতীয় পরিস্থিতিতে, সিউডো-এলোমেলো সংখ্যা জেনারেটরগুলি যেভাবে শুরু করা হয়েছে তাতে দুর্বল নির্বাচনের কারণে সংঘর্ষ হওয়ার ঝুঁকি এবং উদাহরণস্বরূপ, উত্পাদিত সম্ভাব্য উচ্চতর সংখ্যক ইউপিইউডস নকল আইডি তৈরির সম্ভাবনা আরও বেশি করে দেয়।

uuid1()সেই ক্ষেত্রে আরেকটি আগ্রহের বিষয়টি হ'ল প্রথমদিকে প্রতিটি জিইউইউড তৈরি করা মেশিনটি স্পষ্টভাবে রেকর্ড করা হয় (ইউইউডিটির "নোড" অংশে)। এটি এবং সময়ের তথ্য কেবলমাত্র ডিবাগিংয়ের সাথে সহায়তা করতে পারে।


20

আমার দল কেবলমাত্র একটি ডাটাবেস আপগ্রেড স্ক্রিপ্টের জন্য ইউআইডি 1 ব্যবহার করে সমস্যায় পড়েছিল যেখানে আমরা কয়েক মিনিটের মধ্যেই ~ 120k ইউইউডি তৈরি করেছি। ইউআইডি সংঘর্ষের ফলে একটি প্রাথমিক কী বাধা লঙ্ঘন হয়েছিল।

আমরা 100 টি সার্ভার আপগ্রেড করেছি কিন্তু আমাদের অ্যামাজন ইসি 2 উদাহরণগুলিতে আমরা কয়েকবার এই সমস্যাটিতে এসেছি। আমি ঘড়ি ঘন রেজোলিউশনের সন্দেহ করি এবং ইউইউডি 4 এ স্যুইচ করা আমাদের জন্য এটি সমাধান করে।


5

ব্যবহার করার সময় একটি বিষয় লক্ষণীয় uuid1, আপনি যদি ডিফল্ট কলটি ব্যবহার করেন ( clock_seqপ্যারামিটার না দিয়ে) আপনার সংঘর্ষে দৌড়ানোর সম্ভাবনা রয়েছে: আপনার কাছে কেবল 14 বিট র্যান্ডম রয়েছে (100ns এর মধ্যে 18 টি এন্ট্রি জেনারেশন আপনাকে সংঘর্ষের প্রায় 1% সুযোগ দেয় জন্মদিনের প্যারাডক্স / আক্রমণ)। সমস্যাটি বেশিরভাগ ব্যবহারের ক্ষেত্রে কখনই ঘটবে না, তবে ঘড়ি ঘন রেজোলিউশন সহ ভার্চুয়াল মেশিনে এটি আপনাকে কামড় দেবে।


7
@ গুইলুম ব্যবহার করে ভাল অনুশীলনের উদাহরণ দেখতে পারা সত্যিই উপকারী হবে clock_seq....
এরিক

@ গুইলুম আপনি কীভাবে এই% 1% গণনা করেছেন? এলোমেলো 14 টি বিট মানে 10000 প্রতি> = 2 ^ 14 আইডি উত্পন্ন হলে সংঘর্ষের নিশ্চয়তা হবে এবং এর অর্থ হ'ল সংঘর্ষের 1% সম্ভাবনা তখন আপনি যখন 100 এনএস প্রতি প্রায় 163 আইডি উত্পাদন করেন
ম্যাক্স

1
@ ম্যাকস যেমনটি আমি বলেছি, আপনার জন্মদিনের প্যারাডক্সের দিকে নজর দেওয়া উচিত ।
গিলিয়াম

3

সম্ভবত কিছু যা উল্লেখ করা হয় নি স্থানীয় এলাকা।

একটি ম্যাক ঠিকানা বা সময় ভিত্তিক অর্ডারিং (ইউইউডি 1) বর্ধিত ডাটাবেস কর্মক্ষমতা বহন করতে পারে, যেহেতু এলোমেলোভাবে বিতরণ করা (ইউআইডি 4) ( এখানে দেখুন) এর চেয়ে সংখ্যাকে আরও একত্রে বাছাই করা কম কাজ ।

দ্বিতীয় সম্পর্কিত সমস্যা হ'ল ইউআইইউডি 1 ব্যবহার করা ডিবাগিংয়ে কার্যকর হতে পারে, এমনকি মূল ডেটা হারিয়ে গেলে বা স্পষ্টভাবে সংরক্ষণ না করা হয় (এটি সম্ভবত ওপি দ্বারা বর্ণিত গোপনীয়তার ইস্যুটির সাথে বিরোধে রয়েছে)।


1

গৃহীত উত্তরের পাশাপাশি, একটি তৃতীয় বিকল্প রয়েছে যা কিছু ক্ষেত্রে কার্যকর হতে পারে:

এলোমেলো ম্যাকের সাথে ভি 1 ("ভি 1 এমসি")

আপনি ইচ্ছাকৃতভাবে একটি এলোমেলো সম্প্রচার ম্যাক ঠিকানা দিয়ে ভি 1 ইউআইডি উত্পন্ন করে ভি 1 এবং ভি 4 এর মধ্যে একটি হাইব্রিড তৈরি করতে পারেন (এটি ভি 1 স্পেক দ্বারা অনুমোদিত)। ফলস্বরূপ ভি 1 ইউআইডি সময় নির্ভর (নিয়মিত ভি 1 এর মতো), তবে হোস্ট-নির্দিষ্ট সমস্ত তথ্যের অভাব রয়েছে (ভি 4 এর মতো)। এটি এর সংঘর্ষ-প্রতিরোধের মধ্যে v4 এরও অনেক কাছাকাছি: v1mc = 60 বিট সময় + 61 এলোমেলো বিট = 121 অনন্য বিট; v4 = 122 এলোমেলো বিট।

আমি প্রথম যে স্থানটির মুখোমুখি হয়েছিলাম তা হ'ল পোস্টগ্রিসের uuid_generate_v1mc () ফাংশন। আমি তখন থেকে নিম্নলিখিত অজগর সমতুল্য ব্যবহার করেছি:

from os import urandom
from uuid import uuid1
_int_from_bytes = int.from_bytes  # py3 only

def uuid1mc():
    # NOTE: The constant here is required by the UUIDv1 spec...
    return uuid1(_int_from_bytes(urandom(6), "big") | 0x010000000000)

(দ্রষ্টব্য: আমি একটি দীর্ঘ + দ্রুত সংস্করণ পেয়েছি যা সরাসরি ইউইউডি অবজেক্ট তৈরি করে; কেউ চাইলে পোস্ট করতে পারে)


কল / সেকেন্ডের বড় আকারের ক্ষেত্রে, এটি সিস্টেমের এলোমেলোভাবে ছাড়ার সম্ভাবনা রাখে। আপনি পরিবর্তে stdlib মডিউলটি ব্যবহার করতে পারেন random(এটি সম্ভবত আরও দ্রুত হবে)। তবে সতর্ক থাকুন: আক্রমণকারী আরএনজি রাজ্যটি নির্ধারণ করতে পারে এবং এইভাবে ভবিষ্যতের ইউআইডিগুলিকে আংশিকভাবে পূর্বাভাস দেয় it

import random
from uuid import uuid1

def uuid1mc_insecure():
    return uuid1(random.getrandbits(48) | 0x010000000000)

দেখে মনে হচ্ছে এই পদ্ধতিটি "ভি" এর মতো (হোস্ট-অজোনস্টিক) তবে খারাপ (কম বিট, ইউরানডমের উপর নির্ভরতা ইত্যাদি) etc শুধু uuid4 এর সাথে তুলনা করে কি কোনও সুবিধা রয়েছে?
রকেটমনকিগুলি

এটি প্রাথমিকভাবে কেবলমাত্র ক্ষেত্রে আপগ্রেড যেখানে v1 সময় ভিত্তিক গুণাবলীর জন্য কার্যকর, তবুও শক্তিশালী সংঘর্ষ প্রতিরোধের এবং হোস্ট-গোপনীয়তার পছন্দসই। একটি উদাহরণ একটি ডাটাবেসের প্রাথমিক কী হিসাবে - ভি 4 এর তুলনায় ভি 1 ইউুইডের ডিস্কে লেখার সময় আরও ভাল স্থানীয় অঞ্চল থাকবে, আরও দরকারী প্রাকৃতিক ধরণ ইত্যাদি থাকবে তবে আপনার যদি এমন কোনও ঘটনা পাওয়া যায় যেখানে আক্রমণকারী 2 ** পূর্বাভাস দেয় B১ বিট একটি সুরক্ষার সমস্যা (যেমন ইউউইড একটি ননজ হিসাবে), তারপরে iety ধর্মীয় হ্যাঁ, পরিবর্তে uuid4 ব্যবহার করুন (আমি জানি আমি এটি করি!)। উত্তর: আরও খারাপ হওয়ায় এটি ইউরানডম ব্যবহার করে, আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই - পাইথনের অধীনে uuid4 () ইউরেনডমও ব্যবহার করে।
এলি কলিন্স

ভাল জিনিস, যে বোঝার। আপনি (আপনার কোড) কী করতে পারবেন তা না দেখে আপনি কেন এটি চান তা ভাল। পুনরায়: ইউরেনডম, আমি বোঝাতে চাইছি আপনি 2x এলোমেলোভাবে ব্যবহার করছেন (1 uuid1 এর জন্য 1, ইউরেনডমের জন্য অন্যটি), সুতরাং সিস্টেম এন্ট্রপি দ্রুত ব্যবহার করতে পারে।
রকেটমনকিগুলি

এটি আসলে uuid4 এর প্রায় অর্ধেকের বেশি: uuid1 () ঘড়ির_সেকের জন্য 14 টি বিট ব্যবহার করে, যা ইউরেনডামের 2 বাইট পর্যন্ত হয়। ইউইআইডি 1 এমসি র‌্যাপারটিতে 48 টি বিট ব্যবহার করা হয়, যা কলটিতে প্রতি ইউরানডম (8) মোট মোটের জন্য 6 টি বাইটের ইউরেনডম ম্যাপ করা উচিত। যেখানে uuid4 সরাসরি প্রতিটি কলের জন্য ইউরেনডম (16) ডাকে।
এলি কলিন্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.