নেট থেকে হ্যাশ কোডটি সর্বদা শূন্য, নেট। এ থাকা উচিত


88

কোনও সেট সদস্য হিসাবে System.Collections.Generic.HashSet<>গ্রহণের nullমতো সংগ্রহগুলি দেওয়া, যে কেউ হ্যাশ কোডটি কী nullহতে হবে তা জিজ্ঞাসা করতে পারে। ফ্রেমওয়ার্কটি ব্যবহার করে বলে মনে হচ্ছে 0:

// nullable struct type
int? i = null;
i.GetHashCode();  // gives 0
EqualityComparer<int?>.Default.GetHashCode(i);  // gives 0

// class type
CultureInfo c = null;
EqualityComparer<CultureInfo>.Default.GetHashCode(c);  // gives 0

এটি (সামান্য) নালাগুলি এনামগুলিতে সমস্যাযুক্ত হতে পারে। যদি আমরা সংজ্ঞায়িত করি

enum Season
{
  Spring,
  Summer,
  Autumn,
  Winter,
}

তারপরে Nullable<Season>(এটিও বলা হয় Season?) মাত্র পাঁচটি মান নিতে পারে তবে এর মধ্যে দুটি, যথা nullএবং Season.Spring, একই হ্যাশ কোড থাকতে পারে।

এটি এইরকম একটি "আরও ভাল" সমতা তুলনামূলক লিখতে লোভনীয়:

class NewNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
  public override bool Equals(T? x, T? y)
  {
    return Default.Equals(x, y);
  }
  public override int GetHashCode(T? x)
  {
    return x.HasValue ? Default.GetHashCode(x) : -1;
  }
}

তবে হ্যাশ কোডটি হওয়ার কোনও কারণ আছে nullকি 0?

সম্পাদনা / সংস্থান:

কিছু লোক মনে করে এটি ওভাররাইডিং সম্পর্কে Object.GetHashCode()। আসলেই তা হয় না। (.NET লেখক একটি ওভাররাইড করতে করেনি GetHashCode()মধ্যে Nullable<>struct যা হয় যদিও প্রাসঙ্গিক,।) Parameterless একজন ব্যবহারকারী লেখা বাস্তবায়ন GetHashCode()পরিস্থিতি কখনোই সব ব্যবস্থা করতে সক্ষম যেখানে অবজেক্ট যার হ্যাশ কোড আমরা চাইতে হয় null

এটি বিমূর্ত পদ্ধতিটি EqualityComparer<T>.GetHashCode(T)প্রয়োগ করা বা অন্যথায় ইন্টারফেস পদ্ধতিটি বাস্তবায়নের বিষয়ে IEqualityComparer<T>.GetHashCode(T)। এখন, এমএসডিএন-এ এই লিঙ্কগুলি তৈরি করার সময়, আমি দেখতে পাচ্ছি যে এটি সেখানে বলেছে যে ArgumentNullExceptionযদি তাদের একক যুক্তি হয় তবে এই পদ্ধতিগুলি একটি ছুঁড়ে ফেলে null। এমএসডিএন এ নিশ্চয়ই ভুল হতে পারে? .NET এর নিজস্ব প্রয়োগসমূহ কোনওটিই ব্যতিক্রম ছুঁড়ে না ফেলে। যে ক্ষেত্রে নিক্ষেপ কার্যকরভাবে যুক্ত করার জন্য কোন চেষ্টা বিরতি দেবে nullএকটি থেকে HashSet<>HashSet<>কোনও nullআইটেমের সাথে কাজ করার সময় অসাধারণ কিছু না করলে (আমাকে এটি পরীক্ষা করতে হবে)।

নতুন সম্পাদনা / সংস্থান:

এখন আমি ডিবাগ করার চেষ্টা করেছি। এর সাথে HashSet<>, আমি নিশ্চিত করতে পারি যে ডিফল্ট সমতা তুলনামূলক, মানগুলি Season.Springএবং একই বালতিতে শেষ null হবে । এটি খুব সতর্কতার সাথে ব্যক্তিগত অ্যারে সদস্যদের পরিদর্শন করে নির্ধারণ করা যেতে পারে m_bucketsএবং m_slots। নোট করুন যে সূচকগুলি সর্বদা ডিজাইন অনুসারে একের পর এক অফসেট থাকে।

আমি উপরে যে কোডটি দিয়েছি তা এটি ঠিক করে না। দেখা যাচ্ছে যে, HashSet<>মানটি কখনই সমতা তুলনামূলককে জিজ্ঞাসা করবে না null। এটি এর উত্স কোড থেকে HashSet<>:

    // Workaround Comparers that throw ArgumentNullException for GetHashCode(null).
    private int InternalGetHashCode(T item) {
        if (item == null) { 
            return 0;
        } 
        return m_comparer.GetHashCode(item) & Lower31BitMask; 
    }

এর অর্থ হ'ল, অন্ততপক্ষে HashSet<>, এটির হ্যাশ পরিবর্তন করাও সম্ভব নয় nullপরিবর্তে, একটি সমাধান হ'ল এইরকম অন্যান্য মানগুলির হ্যাশ পরিবর্তন করা:

class NewerNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
  public override bool Equals(T? x, T? y)
  {
    return Default.Equals(x, y);
  }
  public override int GetHashCode(T? x)
  {
    return x.HasValue ? 1 + Default.GetHashCode(x) : /* not seen by HashSet: */ 0;
  }
}

26
নাল জন্য হ্যাশ কোডটি শূন্য না হওয়া উচিত কেন? হ্যাশের সংঘর্ষ পৃথিবীর শেষ নয়, আপনি জানেন।
হট লিকস

4
এটি বাদে এটি একটি সুপরিচিত, বেশ সাধারণ, সংঘর্ষ। এটি খারাপ বা এমনকী বড় সমস্যাও নয়, এটি কেবল সহজেই এড়ানো যায়
ক্রিস পিফহল

8
LOL আমি কেন ভাবছি "যদি .NET কাঠামোটি একটি ব্রিজ থেকে লাফ দেয়, আপনি কি এটি অনুসরণ করবেন?" ...
অ্যাডাম হল্ডসওয়ার্থ

4
কৌতূহলের বাইরে, শূন্য মৌসুমটি কী হবে?
SwDevMan81

4
ব্যক্তিগতভাবে, এ কারণেই আমি সবসময় আমার এনামগুলিকে প্রথম খালি হিসাবে "খালি" বা "অজানা" একটি মান দিয়ে থাকি। এইভাবে, আমার সিজন এনাম কখনই স্প্রিংয়ের প্রতিনিধিত্ব করবে না আমাকে স্পষ্টভাবে মান নির্ধারণ না করে, এইভাবে সমস্যাটি বাতিল করে।
ক্রিস

উত্তর:


25

নালসের জন্য ফিরে আসা হ্যাশ কোডটি যতক্ষণ না টাইপের সাথে সামঞ্জস্যপূর্ণ , আপনার ভাল হওয়া উচিত। হ্যাশ কোডের একমাত্র প্রয়োজন হ'ল দুটি বস্তু যা সমান বিবেচিত হয় একই হ্যাশ কোডটি ভাগ করে।

শূন্যের জন্য 0 বা -1 প্রদান করা, যতক্ষণ আপনি একটি চয়ন করেন এবং এটি সমস্ত সময় ফেরত দেন, কাজ করবে। স্পষ্টতই, নন-নাল হ্যাশ কোডগুলি শূন্যের জন্য আপনি যে মানটি ব্যবহার করেন তা ফিরিয়ে দেওয়া উচিত নয়।

অনুরূপ প্রশ্ন:

নালক্ষেত্রে getHashCode?

যখন অবজেক্টের শনাক্তকারী শূন্য থাকে তখন গেটহ্যাশকোডের কী ফিরে আসা উচিত?

এই এমএসডিএন এন্ট্রিটির "মন্তব্যগুলি" হ্যাশ কোডের চারপাশে আরও বিশদে চলে যায়। গ্লানিকর, ডকুমেন্টেশন কোনো কভারেজ বা নাল মান আলোচনা উপলব্ধ করা হয় না এ সব - এমনকি না সমপ্রদায়ে সামগ্রী পারে।

এনামের সাথে আপনার সমস্যা সমাধানের জন্য, হয় শূন্যহীনকে ফেরত দেওয়ার জন্য হ্যাশ কোডটি পুনরায় প্রয়োগ করুন, একটি ডিফল্ট "অজানা" এনাম এন্ট্রি শূন্যের সমান করুন, বা কেবল অ্যানামগুলি ব্যবহার করবেন না।

আকর্ষণীয়ভাবে, উপায় দ্বারা।

আমি এটির সাথে অন্য যে সমস্যাটি দেখতে পাই তা হ্যাশ কোডটি 4 বাইট বা বৃহত্তর ধরণের প্রতিনিধিত্ব করতে পারে না যা কমপক্ষে একটি সংঘর্ষের ছাড়াই (যা প্রকারের আকারের বৃদ্ধি হয় তত বেশি) সংঘাতযোগ্য ul উদাহরণস্বরূপ, কোনও ইন্টের হ্যাশ কোডটি কেবল ইনট হয়, সুতরাং এটি সম্পূর্ণ ইনট রেঞ্জ ব্যবহার করে। শূন্যের জন্য আপনি এই সীমাটিতে কী মান পছন্দ করেন? আপনি যেটিই বেছে নিন তা মানটির হ্যাশ কোডের সাথেই সংঘর্ষে আসে।

তাদের মধ্যে এবং সংঘর্ষগুলি অগত্যা কোনও সমস্যা নয়, তবে আপনার সেগুলি রয়েছে তা আপনার জানা দরকার। হ্যাশ কোডগুলি কেবলমাত্র কিছু পরিস্থিতিতে ব্যবহৃত হয়। এমএসডিএন-তে ডক্সে যেমন বলা আছে, হ্যাশ কোডগুলি বিভিন্ন বস্তুর জন্য বিভিন্ন মান ফেরত দেওয়ার গ্যারান্টিযুক্ত নয় সুতরাং এটি আশা করা উচিত নয়।


আপনার লিঙ্ক করা প্রশ্নগুলি সম্পূর্ণ অনুরূপ বলে আমি মনে করি না। আপনি যখন Object.GetHashCode()নিজের ক্লাসে (বা স্ট্রাক্ট) ওভাররাইড করছেন, আপনি জানেন যে এই কোডটি তখনই আঘাত করা হবে যখন লোকেরা আসলে আপনার শ্রেণীর উদাহরণ থাকবে । উদাহরণটি হতে পারে না null। যে কেন আপনি আপনার ওভাররাইড শুরু করি না Object.GetHashCode()দিয়ে if (this == null) return -1;তার মাঝে "হচ্ছে একটি পার্থক্য null" এবং "একটি বস্তু কিছু ক্ষেত্র আছে অধিকারী হচ্ছে null"।
জেপ্পে স্টিগ নীলসেন

আপনি বলেছেন: স্পষ্টতই, নন-নাল হ্যাশ কোডগুলি নালার জন্য আপনি যে মানটি ব্যবহার করেন তা ফিরিয়ে দেওয়া উচিত নয়। এটা আদর্শ হতে পারে, আমি একমত। এবং এই কারণেই আমি আমার প্রশ্নটি প্রথম স্থানে জিজ্ঞাসা করেছি, কারণ যখনই আমরা একটি এনাম লিখি T, তখন (T?)nullএবং (T?)default(T)একই হ্যাশ কোডটি থাকবে (নেট নেটওয়ার্কের বর্তমান প্রয়োগে)। NET এর প্রয়োগকারীরা হ্যাশ কোডের কোড null বা হ্যাশ কোডের অ্যালগোরিদমকে পরিবর্তন করলে এটি পরিবর্তন করা যেতে পারে System.Enum
জেপ্প স্টিগ নীলসন

আমি সম্মত লিঙ্কগুলি নাল অভ্যন্তরীণ ক্ষেত্রের জন্য ছিল। আপনি উল্লেখ করেছেন এটি আইক্যুয়ালিটি কম্পিউটারের জন্য <টি> আপনার প্রয়োগের ক্ষেত্রে হ্যাশ কোডটি এখনও কোনও ধরণের জন্য নির্দিষ্ট কারণ আপনি এখনও একই পরিস্থিতিতে রয়েছেন, ধরণের ধারাবাহিকতা। যে কোনও ধরণের নালগুলির জন্য একই হ্যাশ কোডটি ফিরিয়ে দেওয়া নালগুলির কোনও প্রকার না থাকায় কোনও ব্যাপার হবে না।
অ্যাডাম হল্ডসওয়ার্থ

4
দ্রষ্টব্য: আমি আমার প্রশ্নটি দু'বার আপডেট করেছি। দেখা যাচ্ছে যে (অন্তত সাথে HashSet<>) এটি হ্যাশ কোডটি পরিবর্তন করতে কাজ করে না null
জেপ্প স্টিগ নীলসেন

6

মনে রাখবেন যে হ্যাশ কোডটি কেবলমাত্র সাম্যতা নির্ধারণের জন্য প্রথম পদক্ষেপ হিসাবে ব্যবহৃত হয় এবং দুটি বস্তু সমান কিনা তা ডি-ফ্যাক্ট সিদ্ধান্ত হিসাবে [কখনই ব্যবহার করা উচিত নয়) [

যদি দুটি অবজেক্টের হ্যাশ কোডগুলি সমান না হয় তবে সেগুলি সমান নয় হিসাবে বিবেচিত হবে (কারণ আমরা ধরে নিই যে আনরিলিং বাস্তবায়ন সঠিক - অর্থাৎ আমরা এটি দ্বিতীয়-অনুমান করি না)। তাদের যদি একই হ্যাশ কোড থাকে তবে তাদের পরে প্রকৃত সাম্যতার জন্য পরীক্ষা করা উচিত যা আপনার ক্ষেত্রে, nullএবং এনাম মানটি ব্যর্থ হবে।

ফলস্বরূপ - শূন্য ব্যবহার করা সাধারণ ক্ষেত্রে অন্য যে কোনও মানের মতোই ভাল।

অবশ্যই, আপনার এনামের মতো পরিস্থিতি থাকবে, যেখানে এই শূন্যটি একটি আসল মানের হ্যাশ কোডের সাথে ভাগ করা আছে । প্রশ্নটি হল, আপনার জন্য, অতিরিক্ত তুলনার মিনিট ওভারহেড সমস্যা সৃষ্টি করে।

যদি তা হয় তবে আপনার নির্দিষ্ট প্রকারের জন্য নালার ক্ষেত্রে আপনার নিজস্ব তুলককে সংজ্ঞায়িত করুন এবং নিশ্চিত করুন যে একটি নাল মান সর্বদা একটি হ্যাশ কোড দেয় যা সর্বদা একই (অবশ্যই!) এবং অন্তর্নিহিত দ্বারা উত্পাদিত হতে পারে না এমন একটি মান দেয় টাইপের নিজস্ব হ্যাশ কোড অ্যালগরিদম। আপনার নিজের ধরণের জন্য, এটি সক্ষম। অন্যদের জন্য - শুভকামনা :)


5

এটা না আছে শূন্য হতে - আপনি এটি 42 যদি তোমরা চেয়েছিলেন করতে পারে।

প্রোগ্রামটি কার্যকর করার সময় যা যা ঘটেছিল তা সবই ধারাবাহিকতা

এটি কেবল সর্বাধিক সুস্পষ্ট উপস্থাপনা, কারণ nullপ্রায়শই অভ্যন্তরীণভাবে শূন্য হিসাবে প্রতিনিধিত্ব করা হয়। যার অর্থ, ডিবাগ করার সময়, যদি আপনি শূন্যের একটি হ্যাশ কোড দেখতে পান, এটি আপনাকে ভাবতে প্ররোচিত করবে, "হুঁ .. এটি কি নাল রেফারেন্স ইস্যু ছিল?"

মনে রাখবেন আপনি যদি এমন একটি নম্বর ব্যবহার করেন 0xDEADBEEFতবে কেউ বলতে পারে যে আপনি যাদু নম্বর ব্যবহার করছেন ... এবং আপনার মত হবে। (আপনি বলতে পারেন শূন্যটিও একটি ম্যাজিক সংখ্যা, এবং আপনি সঠিক ধরনের হবেন ... এটিকে ব্যতিক্রম হিসাবে কিছুটা ব্যতিক্রম হিসাবে এতো ব্যাপকভাবে ব্যবহার করা হয়))


4

ভাল প্রশ্ন.

আমি কেবল এটি কোড করার চেষ্টা করেছি:

enum Season
{
  Spring,
  Summer,
  Autumn,
  Winter,
}

এবং এভাবে চালিত করুন:

Season? v = null;
Console.WriteLine(v);

এটি ফিরে আসে null

আমি যদি না করি তবে পরিবর্তে স্বাভাবিক

Season? v = Season.Spring;
Console.WriteLine((int)v);

এটি 0প্রত্যাশার মতো ফিরে আসে , বা সহজ স্প্রিং যদি আমরা কাস্টিং এড়ানো না হয় int

সুতরাং .. আপনি যদি নিম্নলিখিতটি করেন:

Season? v = Season.Spring;  
Season? vnull = null;   
if(vnull == v) // never TRUE

সম্পাদনা

এমএসডিএন থেকে

যদি দুটি অবজেক্ট সমান হিসাবে তুলনা করে তবে প্রতিটি বস্তুর জন্য getHashCode পদ্ধতিতে একই মানটি ফেরত দিতে হবে। যাইহোক, যদি দুটি বস্তু সমান হিসাবে তুলনা না করে তবে দুটি বস্তুর জন্য গেটহ্যাশকোড পদ্ধতিগুলিকে বিভিন্ন মান ফেরত দিতে হবে না

অন্য কথায় যদি দুটি বস্তুর একই হ্যাশ কোড আছে মানে এই নয় যে তারা সমান, কারণ বাস্তব সমতা দ্বারা নির্ধারিত হয় সমান

আবার এমএসডিএন থেকে:

কোনও অবজেক্টের জন্য গেটহ্যাশকোড পদ্ধতি অব্যাহতভাবে একই হ্যাশ কোডটি প্রদান করতে হবে যতক্ষণ না অবজেক্টের স্থিতির কোনও পরিবর্তন নেই যা অবজেক্টের সমান পদ্ধতির রিটার্ন মান নির্ধারণ করে। মনে রাখবেন যে এটি কেবলমাত্র একটি অ্যাপ্লিকেশনের বর্তমান সম্পাদনের জন্য সত্য এবং অ্যাপ্লিকেশনটি আবার চালানো হলে একটি ভিন্ন হ্যাশ কোড ফিরে আসতে পারে।


6
সংঘর্ষ, সংজ্ঞা অনুসারে, দুটি অসম বস্তুর একই হ্যাশকোড রয়েছে। আপনি প্রমাণ করেছেন যে বস্তু সমান নয়। এখন তাদের কি একই হ্যাশ কোড আছে? ওপি অনুযায়ী তারা করেন, অর্থ এটি একটি সংঘর্ষ। এখন, এটি কোনও সংঘাতের জগতের শেষ নয়, এটি 0 টির বাইরে অন্য কোনও কিছুতে ছুটে যাওয়ার চেয়ে পারফরম্যান্সকে ব্যথিত করে than
23:55

4
সুতরাং আপনার উত্তর আসলে কি বলে? আপনি বলেছেন যে মরসুম.স্প্রিং নালার সমান নয়। ঠিক আছে, এটি ভুল নয়, তবে এটি এখন কোনওভাবেই প্রশ্নের উত্তর দেয় না it
পরিবেশন করুন

4
@ সার্ভে: প্রশ্নটি বলেছেন: আমার কাছে কেন 2 টি পৃথক বস্তুর ( নাল এবং স্প্রিং ) জন্য একই হ্যাসকোড রয়েছে । সুতরাং উত্তরটি হ'ল একই ধরণের হ্যাশকোড থাকার কারণে সংঘর্ষের কারণ নেই, তবে তারা সমান নয়।
টিগ্রান

4
"উত্তর: কেন নয়?" ঠিক আছে, ওপিতে "কেন নয়" আপনার প্রশ্নের উত্তর-পূর্বে জবাব দিয়েছিল। এটি অন্য সংখ্যার তুলনায় সংঘর্ষের সম্ভাবনা বেশি। তিনি ভাবছিলেন যে যদি কোনও কারণ 0 বাছাই করা হয়েছিল, এবং এখনও পর্যন্ত কেউ এর উত্তর দেয় নি।
23:58

4
এই উত্তরটিতে এমন কোনও কিছুই নেই যা ওপি ইতিমধ্যে জানে না, প্রশ্নটি যেভাবে জিজ্ঞাসা করা হয়েছিল তার থেকে তা প্রমাণিত।
কনরাড রুডলফ

4

তবে নালটির হ্যাশ কোডটি 0 হওয়ার কোনও কারণ আছে কি?

এটি কিছু হতে পারে। আমি একমত হতে চাই যে 0 অপরিহার্যভাবে সেরা পছন্দ ছিল না, তবে এটি এমন একটি যা সম্ভবত সবচেয়ে কম বাগের দিকে নিয়ে যায়।

একটি হ্যাশ ফাংশন একেবারে একই মানের জন্য একই হ্যাশ ফেরত দিতে হবে । এটির একটি উপাদান উপস্থিত হয়ে গেলে, হ্যাশটির পক্ষে এটিই কেবলমাত্র বৈধ মান null। এটির জন্য যদি কোনও ধ্রুবক থাকে, যেমন, এইচএম object.HashOfNull, তবে কোনও প্রয়োগকারী কাউকে IEqualityComparerসেই মানটি ব্যবহার করতে হবে। তারা যদি এটি সম্পর্কে চিন্তা না করে তবে তারা 0 ব্যবহার করার সুযোগটি অন্য প্রতিটি মানের তুলনায় কিছুটা বেশি I

কমপক্ষে হ্যাশসেট <> এর জন্য নালের হ্যাশ পরিবর্তন করাও সম্ভব নয়

উপরে উল্লিখিত হিসাবে, আমি মনে করি এটি সম্পূর্ণ অসম্ভব সম্পূর্ণ স্টপ, কারণ ইতিমধ্যে এমন ধরনের উপস্থিত রয়েছে যা ইতিমধ্যে কনভেনশন অনুসরণ করে নাল হ্যাশ 0 হয়।


এক কার্যকরী পদ্ধতি যখন EqualityComparer<T>.GetHashCode(T)কিছু বিশেষ টাইপ জন্য Tযে অনুমতি দেয় null, এক কি আছে কিছু যখন যুক্তি null। আপনি (1) একটি নিক্ষেপ করতে ArgumentNullExceptionপারেন 0, (2) রিটার্ন করতে পারেন , বা (3) অন্য কিছু ফেরত দিতে পারেন। আমি আপনার উত্তরটি সর্বদা 0সেই পরিস্থিতিতে ফিরে আসার জন্য একটি সুপারিশের জন্য নিই ?
জেপ্প স্টিগ নীলসেন

@ জেপ্পস্টিগনিয়েলসন আমি থ্রো বনাম রিটার্ন সম্পর্কে নিশ্চিত নই, তবে আপনি যদি ফিরতে পছন্দ করেন তবে অবশ্যই শূন্য।
রোমান স্টারকভ

2

এটি সরলতার জন্য 0 এর মতো শক্ত প্রয়োজন নেই। আপনার কেবল হ্যাশ কোডিংয়ের সাধারণ প্রয়োজনীয়তা নিশ্চিত করতে হবে।

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

অবশ্যই, আমি আমার উত্তরটি গাণিতিক প্রকৃতির প্রয়োজনীয়তার সাথে সীমাবদ্ধ করেছি। এছাড়াও নেট-নির্দিষ্ট, প্রযুক্তিগত শর্তাদি রয়েছে, যা আপনি এখানে পড়তে পারেন । 0 একটি নাল মান জন্য তাদের মধ্যে হয় না।


1

সুতরাং Unknownএনাম মান ব্যবহার করে এড়ানো যায় (যদিও এটি Seasonঅজানা হওয়ার জন্য এটি কিছুটা অদ্ভুত বলে মনে হয়)। সুতরাং এর মতো কিছু এই বিষয়টিকে অস্বীকার করবে:

public enum Season
{
   Unknown = 0,
   Spring,
   Summer,
   Autumn,
   Winter
}

Season some_season = Season.Unknown;
int code = some_season.GetHashCode(); // 0
some_season = Season.Autumn;
code = some_season.GetHashCode(); // 3

তারপরে আপনার প্রতিটি মরসুমে অনন্য হ্যাশ কোড মান থাকবে।


4
হ্যাঁ, তবে এটি আসলে প্রশ্নটির উত্তর দেয় না question প্রশ্ন অনুসারে নালটি জ্ঞানের সাথে সংঘর্ষ করবে। একটি পার্থক্য কি?
টিগ্রান

@ টিগ্রান - এই সংস্করণটি কোনও
অযোগ্য

আমি দেখতে পাচ্ছি, তবে প্রশ্নটি নালামের ধরণের।
টিগ্রান

লোকেরা যেভাবে উত্তর দেয় উন্নতির পরামর্শ দেয় সে জন্য আমার SO তে মিলিয়ন বার দৃশ্যাবলী রয়েছে।
SwDevMan81

1

ব্যক্তিগতভাবে আমি অযোগ্য মানগুলি কিছুটা বিশ্রী ব্যবহার করে দেখতে পাই এবং যখনই পারি সেগুলি এড়াতে চেষ্টা করি। আপনার সমস্যাটি অন্য একটি কারণ। কখনও কখনও তারা যদিও খুব সুবিধাজনক তবে আমার থাম্বের নিয়মটি যদি সম্ভব হয় তবে এগুলি দুটি ভিন্ন জগতের কারণে শূন্যের সাথে মান ধরণের মিশ্রণ নয়। .NET ফ্রেমওয়ার্কে তারা একই কাজ করে বলে মনে হচ্ছে - প্রচুর মান ধরণের TryParseপদ্ধতি প্রদান করে যা কোনও মূল্যকে মান ( null) থেকে পৃথক করার একটি উপায় ।

আপনার নির্দিষ্ট ক্ষেত্রে সমস্যা থেকে মুক্তি পাওয়া সহজ কারণ আপনি নিজের Seasonধরণের পরিচালনা করেন।

(Season?)nullআমার কাছে অর্থ 'মরসুম নির্দিষ্ট করা হয়নি' যেমন আপনার যখন কোনও ওয়েবফর্ম থাকে যেখানে কয়েকটি ক্ষেত্রের প্রয়োজন হয় না। আমার মতে enumকিছুটা আড়ষ্ট ব্যবহার না করে নিজেই সেই বিশেষ 'মান' নির্দিষ্ট করা ভাল Nullable<T>। এটি পড়ার পক্ষে ( Season.NotSpecifiedবনাম null) আরও দ্রুত হবে ( বনাম ) এবং হ্যাশ কোডগুলি দিয়ে আপনার সমস্যার সমাধান করবে।

অবশ্যই অন্যান্য ধরণের ক্ষেত্রে যেমন intআপনি মান ডোমেনকে প্রসারিত করতে পারবেন না এবং মানগুলির একটিকে বিশেষ হিসাবে চিহ্নিত করা সর্বদা সম্ভব নয়। তবে int?হ্যাশ কোডের সাথে সংঘর্ষ অনেক কম সমস্যা, যদি তা হয় তবে।


আপনি যখন "বক্সিং" বলছেন, তখন আমার মনে হয় আপনার অর্থ "মোড়ানো", অর্থাত্ স্ট্রাক্টের অভ্যন্তরে একটি Nullable<>স্ট্রাক্ট মান স্থাপন করা (যেখানে HasValueসদস্যটি তখন সেট করা হবে true)। আপনি কি নিশ্চিত যে সমস্যাটি আসলেই ছোট int?? অনেক সময় কেবলমাত্র কয়েকটি মান ব্যবহার করা হয় intএবং তারপরে এটি এনামের সমতুল্য (যা তাত্ত্বিকভাবে অনেক সদস্য থাকতে পারে)।
জেপ্পে স্টিগ নীলসেন

সাধারণত আমি বলব যে যখন প্রয়োজনীয় সীমিত সংখ্যার মান প্রয়োজন (2-10) তখন এনামটি বেছে নেওয়া হয়। সীমা যদি বড় হয় বা না হয় তবে intআরও বোধ হয়। অবশ্যই পছন্দগুলি পৃথক হয়।
ম্যাকিয়েজ

0
Tuple.Create( (object) null! ).GetHashCode() // 0
Tuple.Create( 0 ).GetHashCode() // 0
Tuple.Create( 1 ).GetHashCode() // 1
Tuple.Create( 2 ).GetHashCode() // 2

4
এটি একটি আকর্ষণীয় পদ্ধতির। কিছু অতিরিক্ত ব্যাখ্যা অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি সম্পাদনা করা দরকারী এবং বিশেষত প্রশ্নের প্রকৃতি দেওয়া।
জেরেমি ক্যানি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.