সি # তে এসএএএ 1 অ্যালগোরিদমের সাথে হ্যাশিং


86

আমি আলগোরিদম ব্যবহারের byte[]সাহায্যে অ্যারে প্রদত্ত অ্যারেটি চাই । হ্যাশ ইউনিট পরীক্ষা থেকে আসতে হবে। প্রত্যাশিত হ্যাশটি (কেস সংবেদনশীল)।SHA1SHA1Managed
byte[]
0d71ee4472658cd5874c5578410a9d8611fc9aef

আমি কীভাবে এটি অর্জন করতে পারি?

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {

    }
}

4
আপনার এক্সপেক্টেড হ্যাশ একটি হেক্সাডেসিমাল মান, সুতরাং এটি কেস সংবেদনশীল হিসাবে কিছু যায় আসে না যেমনhex(e) == hex(E)
জ্যাক

উত্তর:


173

যারা হ্যাশের একটি "স্ট্যান্ডার্ড" পাঠ্য বিন্যাস চান তাদের জন্য আপনি নীচের মতো কিছু ব্যবহার করতে পারেন:

static string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
            // can be "x2" if you want lowercase
            sb.Append(b.ToString("X2"));
        }

        return sb.ToString();
    }
}

এটি একটি হ্যাশ মত উত্পাদন করবে 0C2E99D0949684278C30B9369B82638E1CEAD415

বা একটি কোড গল্ফ সংস্করণ জন্য:

static string Hash(string input)
{
    var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
    return string.Concat(hash.Select(b => b.ToString("x2")));
}

এটি আমাকে বাগ দেয় যে এই সমাধানটি SHA1 ম্যানেজড অবজেক্টটিকে ডিসপোজ করে না, কারণ এটি ডিসপোজযোগ্য হিসাবে চিহ্নিত is এই পোস্টটি অপ্টিমাইজ করার সময় সুবিধাজনক হতে পারে: স্ট্যাকওভারফ্লো.com
আকাশ-দেব

@ আকাশ-দেব, আমি সাধারণত এর সাথে একমত হই IDisposable, তবে রেফারেন্স উত্সটিতে একটি দ্রুত ভ্রমণ দেখায় যে আকর্ষণীয় কিছুই ঘটেনি.Dispose()
মিচ

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

21
@ মিচ এটি যদি আইডিস্পোজেবল ইন্টারফেস প্রয়োগ করে তবে রেফারেন্স উত্সে যা ঘটে তা বিবেচ্য নয়। তাদের কখনই কোনও কারণে এটি পরিবর্তন করা উচিত যে .ডিসপোজ () কলটি গুরুত্বপূর্ণ হয়ে উঠলে আপনার আগের ওয়ার্কিং কোডটি এখন একটি সমস্যা তৈরি করছে। আপনি কী থেকে দূরে সরে যেতে পারবেন তা নির্ধারণ করার জন্য কোনও কাঠামোর অন্ত্রের দিকে তাকাতে নির্ভর করা রক্ষণাবেক্ষণের দুঃস্বপ্নের পথ। আমি ডকুমেন্টেশন অনুসরণ এবং ডিসপোজেবল অবজেক্টগুলি সঠিকভাবে পরিচালনা করার পরামর্শ দিচ্ছি, এটি দীর্ঘমেয়াদে আপনার ব্যথা বাঁচাবে।
unenthusiasticuser

4
@ আইজটি, এক্স 2 এটিকে প্রতি বাইটে দুটি হেক্সাডেসিমাল অঙ্ক ব্যবহার করতে বলে। x2মানে ছোট হাতের অক্ষর, X2বড়হাঁস
ম্যাচ

38
public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

সম্পাদনা:

বাইট অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করার সময় আপনি এনকোডিংটি নির্দিষ্ট করতে পারেন:

return System.Text.Encoding.UTF8.GetString(hash);

বা

return System.Text.Encoding.Unicode.GetString(hash);

আমি এই কোডগুলি আগে লিখেছি কিন্তু এটি কাজ করে না কারণ আমি জানি না
মেরভে কেয়া

4
যদি তারা একটি হেক্স স্ট্রিং চান তবে বেস 64 সম্ভবত ভুল পছন্দ।
জোয়

@ জো: গ্রান্টথোমাসের দেওয়া উত্তরের বিপরীতে সদস্যটি ইঙ্গিত দিয়েছিল যে তাদের একটি স্ট্রিং ফিরিয়ে দিতে হবে
জন গ্যাথোগো

@ মেরভেকায়েয়া: সম্ভবত "আপনি এটি কাজ করেননি" দ্বারা আপনার অর্থটি বোঝানো উচিত। ইনকামিং বাইট অ্যারে কোনটি উপস্থাপন করে? আপনি কীভাবে "SHA1 পরিচালিত" নির্ধারণ করেছেন - আগত বাইট অ্যারে হ্যাশ 0d71ee4472658cd5874c5578410a9d8611fc9aefকরে আউটপুট হিসাবে আপনাকে দেওয়া উচিত ?
জন গাথোগো

বাইট [] হ্যাশ ইউনিট পরীক্ষা থেকে আসে। প্রশ্নে তারা লিখেছেন যে প্রত্যাশিত হ্যাশটি 0d71ee4472658cd5874c5578410a9d8611fc9aef is এটি ইউনিট পরীক্ষা থেকে আসে
মেরভে কেয়া

15

এই যে আমি সঙ্গে গিয়েছিলাম। আপনারা যারা অপ্টিমাইজ করতে চান তাদের জন্য https://stackoverflow.com/a/624379/991863 দেখুন

    public static string Hash(string stringToHash)
    {
        using (var sha1 = new SHA1Managed())
        {
            return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash)));
        }
    }

আমাকে বিটকনভার্টার.টোস্ট্রিং (sha1.ComputeHash (বাইটস)) ব্যবহার করতে হয়েছিল it এর পরে এটি কবজির মতো কাজ করেছিল! ধন্যবাদ!
স্যাম

9

দ্রুততম উপায় এটি:

    public static string GetHash(string input)
    {
        return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray());
    }

x2এর পরিবর্তে ছোট অক্ষরের আউটপুট ব্যবহারের জন্যX2


4
SHA1 ম্যানেজড আইডিস্পোজেবল কার্যকর করে, তাই আপনি সম্ভবত এটি সংস্থান করতে চাইলে এটি সংস্থানগুলি মুক্ত করার জন্য করা হবে want
রিকিতিফক্স

8

আপনি "নির্দিষ্ট বাইট অ্যারের জন্য মান গণনা" করতে পারেন ComputeHash:

var hash = sha1.ComputeHash(temp);

আপনি যদি স্ট্রিং প্রতিনিধিত্বের ফলাফলটি বিশ্লেষণ করতে চান তবে আপনাকে {0:X2}ফর্ম্যাট স্পেসিফায়ার ব্যবহার করে বাইটগুলি বিন্যাস করতে হবে ।


4

আমি এখানে আমার টুপি ফেলে দেব:

(স্থির শ্রেণীর অংশ হিসাবে, যেমন এই স্নিপেট দুটি এক্সটেনশন)

//hex encoding of the hash, in uppercase.
public static string Sha1Hash (this string str)
{
    byte[] data = UTF8Encoding.UTF8.GetBytes (str);
    data = data.Sha1Hash ();
    return BitConverter.ToString (data).Replace ("-", "");
}
// Do the actual hashing
public static byte[] Sha1Hash (this byte[] data)
{
    using (SHA1Managed sha1 = new SHA1Managed ()) {
    return sha1.ComputeHash (data);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.