কীভাবে নির্ধারক নির্দেশিকা তৈরি করবেন


103

আমাদের অ্যাপ্লিকেশনটিতে আমরা একটি বৈশিষ্ট্যযুক্ত এক্সএমএল ফাইল তৈরি করছি যার একটি গাইড মান রয়েছে। এই মানটি ফাইল আপগ্রেডের মধ্যে সামঞ্জস্য হওয়া দরকার। সুতরাং ফাইলের অন্য সব কিছু পরিবর্তিত হলেও, গুণাবলীর জন্য গাইডের মানটি একই থাকবে।

একটি সুস্পষ্ট সমাধান হ'ল ফাইল নাম এবং তাদের জন্য ব্যবহৃত নির্দেশিকাগুলি সহ একটি স্থিতিশীল অভিধান তৈরি করা। তারপরে আমরা যখনই ফাইলটি উত্পন্ন করি তখন আমরা ফাইলের নামের জন্য অভিধানটি সন্ধান করি এবং সংশ্লিষ্ট গাইড ব্যবহার করি। তবে এটি সম্ভবপর নয় কারণ আমরা ১০০ এর ফাইল স্কেল করতে পারি এবং গাইডের বড় তালিকা বজায় রাখতে চাই না।

সুতরাং অন্য পদ্ধতির ছিল ফাইলের পথের উপর ভিত্তি করে গাইডকে একই করা। যেহেতু আমাদের ফাইল পাথ এবং অ্যাপ্লিকেশন ডিরেক্টরি কাঠামোটি অনন্য, সেই পথটির জন্য গাইডটি অনন্য হওয়া উচিত। সুতরাং প্রতিবার আমরা একটি আপগ্রেড চালানোর সময় ফাইলটি তার পথের ভিত্তিতে একই নির্দেশিকা পায়। আমি এই জাতীয় ' নির্ধারক গাইড ' উত্পন্ন করার একটি দুর্দান্ত উপায় পেয়েছি (ধন্যবাদ এল্টন স্টোনম্যান)। এটি মূলত এটি করে:

private Guid GetDeterministicGuid(string input) 

{ 

//use MD5 hash to get a 16-byte hash of the string: 

MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); 

byte[] inputBytes = Encoding.Default.GetBytes(input); 

byte[] hashBytes = provider.ComputeHash(inputBytes); 

//generate a guid from the hash: 

Guid hashGuid = new Guid(hashBytes); 

return hashGuid; 

} 

সুতরাং একটি স্ট্রিং দেওয়া হয়েছে, গাইড সর্বদা একই থাকবেন।

এটি করার জন্য অন্য কোনও পন্থা বা প্রস্তাবিত উপায় আছে? এই পদ্ধতির উপকারিতা বা বিপরীত কী কী?

উত্তর:


151

@ ব্যাকার দ্বারা উল্লিখিত হিসাবে, আরএফসি 4122 -4.3 নাম-ভিত্তিক ইউইউডি তৈরির উপায় নির্ধারণ করে। এটি করার সুবিধা (কেবলমাত্র একটি এমডি 5 হ্যাশ ব্যবহারের মাধ্যমে) এটির নামবিহীন ভিত্তিক ইউআইডিগুলির সাথে সংঘর্ষ না হওয়ার গ্যারান্টিযুক্ত এবং অন্যান্য নাম ভিত্তিক ইউআইডিগুলির সাথে সংঘর্ষের খুব (খুব) সামান্য সম্ভাবনা রয়েছে।

এগুলি তৈরির জন্য। নেট ফ্রেমওয়ার্কে কোনও নেটিভ সমর্থন নেই, তবে আমি গিটহাবের কোড পোস্ট করেছি যা অ্যালগরিদম প্রয়োগ করে। এটি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

Guid guid = GuidUtility.Create(GuidUtility.UrlNamespace, filePath);

অন্য জিইউইডিগুলির সাথে সংঘর্ষের ঝুঁকি আরও কমাতে, আপনি নাম স্পেস আইডি হিসাবে ব্যবহার করতে একটি ব্যক্তিগত জিইউইডি তৈরি করতে পারেন (আরএফসিতে সংজ্ঞায়িত ইউআরএল নেমস্পেস আইডি ব্যবহার করার পরিবর্তে)।


5
@ পৃষ্ঠাগুলি: আরএফসি 4122 টি ভুল এবং এতে ত্রুটি রয়েছে যা সি কোড ( rfc-editor.org/errata_search.php?rfc=4122&eid=1352 ) ঠিক করে। যদি এই বাস্তবায়ন আরএফসি 4122 এবং এর ত্রুটিগুলি সম্পূর্ণরূপে মেনে চলে না তবে দয়া করে আরও বিশদ সরবরাহ করুন; আমি এটি মান অনুসরণ করতে চাই।
ব্র্যাডলি গ্রেনার

1
@ ব্র্যাডলিগ্রেনগার: আমি তা লক্ষ্য করিনি, ধন্যবাদ / দুঃখিত! আরএফসি পড়ার সময় আমার সবসময়
ত্রুটিটি

3
@ পোর্জস: আপনি স্বাগত / কোনও সমস্যা নেই। এটি মনে উদ্রেক করে যে তারা ত্রুটি-বিচ্যুতির দিক থেকে সংশোধন করে আরএফসি-তে জায়গায় আপডেট করে না। এমনকি দস্তাবেজের শেষে একটি লিঙ্ক পাঠকের উপর ত্রুটিযুক্ত অনুসন্ধানের কথা মনে রাখার চেয়ে ভরসা করার চেয়ে অনেক বেশি সহায়ক হবে (আশা করি আরএফসির উপর ভিত্তি করে বাস্তবায়ন লেখার আগে ...)।
ব্র্যাডলি গ্রেনার

1
@ ব্র্যাডলিগ্রাইঞ্জার: আপনি যদি এইচটিএমএল সংস্করণ ব্যবহার করেন তবে এটির শিরোনাম থেকে ত্রুটি-বিচ্যুতির একটি লিঙ্ক রয়েছে, উদাহরণস্বরূপ সরঞ্জাম.এইটিএফ.গ্রা । আমি ভাবছি যে যদি কোনও ব্রাউজারের এক্সটেনশানটি সর্বদা এইচটিএমএল সংস্করণে পুনর্নির্দেশের জন্য থাকে ...
22

2
আপনার এটি NET .NET রেপোতে
নীলমণি

29

এটি কোনও বাইরের সমাবেশ আমদানি না করে কোনও স্ট্রিংকে গাইডে রূপান্তর করবে।

public static Guid ToGuid(string src)
{
    byte[] stringbytes = Encoding.UTF8.GetBytes(src);
    byte[] hashedBytes = new System.Security.Cryptography
        .SHA1CryptoServiceProvider()
        .ComputeHash(stringbytes);
    Array.Resize(ref hashedBytes, 16);
    return new Guid(hashedBytes);
}

একটি অনন্য গাইড উত্পন্ন করার জন্য আরও অনেক ভাল উপায় আছে তবে এটি একটি গাইড ডেটা কীতে ধারাবাহিকভাবে স্ট্রিং ডেটা কী আপগ্রেড করার একটি উপায়।


ফেডারেটেড ডিস্ট্রিবিউশনের জন্য একটি ডেটাবেজে অনন্য সনাক্তকারী ব্যবহার করার সময় এই স্নিপেটটি দরকারী হিসাবে পাওয়া যায়।
গ্লেনো

6
সতর্কবাণী! এই কোডটি বৈধ গাইড / ইউইউডি উত্পন্ন করে না (যেমন নীচে বর্ণিত বাচার)। সংস্করণ বা প্রকার ক্ষেত্র দুটিই সঠিকভাবে সেট করা নেই।
মার্কাসচেবার

3
এমডি 5 এর দৈর্ঘ্য ইতোমধ্যে 16 বাইট হওয়ায় এটি কি এসএএএ 1 এর পরিবর্তে এমডি 5 ক্রাইপটোসোসাইভারপ্রাইডারটি ব্যবহার করা ঠিক তত কার্যকর হবে না?
Brain2000

20

রব যেমন উল্লেখ করেছে, আপনার পদ্ধতিটি কোনও ইউইউডি উত্পন্ন করে না, এটি একটি হ্যাশ তৈরি করে যা ইউআইডির মতো দেখায়।

জন্য RFC 4122 সংস্করণ 3 ও 5 ব্যবহার MD5 এবং SHA1 এ (যথাক্রমে) - UUID জানা উপর বিশেষভাবে নির্ণায়ক (নাম ভিত্তিক) UUID জানা সম্ভব হয়। বেশিরভাগ মানুষ সম্ভবত সংস্করণ 4 এর সাথে পরিচিত, যা এলোমেলো। উইকিপিডিয়া সংস্করণগুলির একটি ভাল ওভারভিউ দেয়। (নোট করুন যে এখানে 'সংস্করণ' শব্দের ব্যবহারটি ইউইউডি-র সংস্করণ 5 এর 'টাইপ' বর্ণনা করে বলে মনে হয়) সংস্করণ 5 সংস্করণ 4 -কে ছাড়িয়ে যায় না)।

পাইথন ইউইড মডিউল , বুস্ট.ইউইড (সি ++) এবং ওএসএসপি ইউআইডি সহ সংস্করণ 3/5 ইউআইডিগুলি তৈরি করার জন্য কয়েকটি গ্রন্থাগার রয়েছে বলে মনে হচ্ছে । (আমি কোনও নেট নেট খুঁজিনি)


1
মূল পোস্টারটি ঠিক এটির পরে। আপনার কাছে স্ট্রিং দিয়ে শুরু করতে এবং এটি একটি জিইউডিতে রূপান্তর করার জন্য ইউইউডি এর কাছে ইতিমধ্যে একটি অ্যালগরিদম রয়েছে। ইউআইডি সংস্করণ 3 এমডি 5 এর সাথে স্ট্রিং হ্যাশ করে, সংস্করণ 5 এটিকে এসএএএ 1 দিয়ে হ্যাশ করে। একটি "নির্দেশিকা" তৈরির গুরুত্বপূর্ণ বিষয়টি হ'ল এটি অন্যান্য জিইউইডিগুলির বিরুদ্ধে "অনন্য" করা। অ্যালগরিদম দুটি বিট সংজ্ঞায়িত করে যা অবশ্যই সেট করতে হবে, পাশাপাশি একটি স্তনবৃন্ত 3 বা 5 তে সেট করা হবে, এটির সংস্করণ 3 বা 5 এর উপর নির্ভর করে
ইয়ান বয়ড

2
"সংস্করণ" শব্দের ব্যবহার সম্পর্কে, আরএফসি 4122 §4.1.3 বলেছে: "সংস্করণটি আরও সঠিকভাবে একটি উপ-ধরণের; আবার, আমরা সামঞ্জস্যতার জন্য শব্দটি ধরে রাখি" "
ব্র্যাডলি গ্রেনার

11
আমি গিটহাবে ভি 3 এবং ভি 5 জিইউইডি
ব্র্যাডলি গ্রেঞ্জার

@ ব্র্যাডলিগ্রেনার, আমি সতর্কবাণী বিটওয়াইস-বা অপারেটরটিকে সাইন-এক্সটেন্ডেড অপারেন্ডে ব্যবহার করব; প্রথমে একটি ছোট স্বাক্ষরযুক্ত প্রকারে কাস্টিংয়ের কথা বিবেচনা করুন
সেবাস্তিয়ান

1
এটি অফ-টপিক হচ্ছে! গিটহাবের কাছে পৃথক lib বাগ প্রতিবেদন সরিয়ে দেওয়ার পরামর্শ দিন।
বেকার

3

আপনার ক্লাসের উদাহরণগুলির মধ্যে Guidএবং বিশ্বব্যাপী অনন্য শনাক্তকারীদের মধ্যে পার্থক্য তৈরি করতে হবে । একটি "নিয়ন্ত্রক নির্দেশিকা" আসলে একটি হ্যাশ (যেমন আপনার কল দ্বারা প্রমাণিত provider.ComputeHash)। গাইডের মাধ্যমে তৈরি করা গাইডের চেয়ে হ্যাশগুলির সংঘর্ষের (একই হ্যাশ উত্পাদন করতে দুটি ভিন্ন ভিন্ন স্ট্রিং ঘটার) সম্ভাবনা রয়েছে Guid.NewGuid

সুতরাং আপনার পদ্ধতির সাথে সমস্যা হ'ল দুটি ভিন্ন পথ একই জিইউইডি উত্পাদন করবে এমন সম্ভাবনার সাথে আপনাকে ঠিক থাকতে হবে। আপনার যদি কোনও সনাক্তকারী প্রয়োজন যা কোনও প্রদত্ত পাথ স্ট্রিংয়ের জন্য অনন্য, তবে করণীয় সবচেয়ে সহজ কাজটি কেবল স্ট্রিংটি ব্যবহার করা । আপনার ব্যবহারকারীদের থেকে স্ট্রিংটি অস্পষ্ট করার প্রয়োজন হলে এটি এনক্রিপ্ট করুন - আপনি ROT13 বা আরও শক্তিশালী কিছু ব্যবহার করতে পারেন ...

জিইউইডি ডেটাটাইপের কোনও খাঁটি জিইউডি নয় এমন কিছু জুতো ছড়িয়ে দেওয়ার চেষ্টা করা ভবিষ্যতে রক্ষণাবেক্ষণের সমস্যা হতে পারে ...


2
আপনি দাবি করেন যে "হ্যাশগুলির সাথে সংঘর্ষের অনেক বেশি সম্ভাবনা রয়েছে ... গাইডের চেয়ে নতুন গাইড তৈরি করা নিউ নিউইউইডের চেয়ে বেশি।" আপনি কি এ সম্পর্কে বিস্তারিত বলতে পারেন? গাণিতিক দৃষ্টিকোণ থেকে, একটি সেট করতে পারবেন বিটের সংখ্যা একই, এবং MD5 এবং SHA1 উভয়ই ক্রিপ্টোগ্রাফিক হ্যাশগুলি বিশেষত (দুর্ঘটনাজনিত এবং উদ্দেশ্যমূলক) হ্যাশের সংঘর্ষের সম্ভাবনা হ্রাস করার জন্য ডিজাইন করা হয়েছে।
মার্কাসচেবার

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

2

MD5 দুর্বল, আমি বিশ্বাস করি আপনি SHA-1 দিয়ে একই জিনিসটি করতে পারেন এবং আরও ভাল ফলাফল পেতে পারেন।

বিটিডাব্লু, কেবলমাত্র একটি ব্যক্তিগত মতামত, একটি এমআইডি 5 হ্যাশকে জিইউইউডি হিসাবে সাজাতে এটি কোনও ভাল জিইউইডি তৈরি করে না। তাদের প্রকৃতির জিইউইডিগুলি নির্ধারক নয়। এটি একটি প্রতারণার মতো অনুভব করে। কেন কেবল একটি কোদালকে একটি কোদাল বলা হয় না এবং কেবল তার ইনপুটটির একটি স্ট্রিং রেন্ডার হ্যাশ বলে। আপনি এই নতুন লাইন লাইনের পরিবর্তে এই লাইনটি ব্যবহার করে তা করতে পারেন:

string stringHash = BitConverter.ToString(hashBytes)

আপনার ইনপুটটির জন্য ধন্যবাদ, তবে এটি এখনও আমাকে একটি স্ট্রিং দেয় এবং আমি একটি জিইউইডি খুঁজছি ...
পুনিত ভোড়া

ঠিক আছে, আপনার হ্যাশটিকে "জিইউডি" বলুন, সমস্যা সমাধান হয়েছে। বা আসল সমস্যাটি হ'ল আপনার কোনও বস্তুর প্রয়োজনGuid ?
ইউজার 7116

আমার ইচ্ছা যদি এটি সাধারণ ছিল .. :) তবে হ্যাঁ, আমার একটি 'জিইউডি' অবজেক্ট দরকার
পুনিত ভোড়া

5
"তাদের স্বভাবের জিইউইডিগুলি নির্ধারক নয়" - এটি জিআইডিগুলির নির্দিষ্ট ধরণের ('সংস্করণ') এর ক্ষেত্রেই সত্য। তবে আমি সম্মত যে @ ব্র্যাডলি গ্রেনার এবং @ রব ফনসেকা-এনসোর দ্বারা বর্ণিত অন্যান্য কারণে "জিডিইউ হিসাবে এমডি 5 হ্যাশ পোষাক করা ভাল জিইউইডি তৈরি করে না" এবং এই প্রশ্নের আমার উত্তর।
বাচার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.