একটি হ্যাশ মান তৈরি করতে একটি এক্সেল ফাংশন আছে?


26

আমি নথির নাম অনুসারে প্রচুর তথ্য তালিকার সাথে কাজ করছি। ডকুমেন্টের নামগুলি খুব বর্ণনামূলক হলেও এগুলি বেশ জটিল হয়ে উঠেছে যদি আমি সেগুলি দেখতে পারি (256 বাইট অব রিয়েল এস্টেট অনেক বেশি) এবং আমি প্রয়োজন এমন একটি ছোট কীফিল্ড তৈরি করতে সক্ষম হতে চাই যা আমার প্রয়োজনে সহজেই পুনরুত্পাদনযোগ্য VLOOKUPঅন্য ওয়ার্কশিট বা ওয়ার্কবুক থেকে একটি করতে ।

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

এই বা অন্য কৌশল সম্পর্কে কোন চিন্তা বা ধারণা?

উত্তর:


34

আপনার নিজের ফাংশনটি লেখার দরকার নেই - অন্যরা ইতিমধ্যে এটি আপনার জন্য করেছে।
উদাহরণস্বরূপ আমি এই স্ট্যাকওভারফ্লো উত্তরের পাঁচটি ভিবিএ হ্যাশ ফাংশন সংগ্রহ করেছি এবং তুলনা করেছি

ব্যক্তিগতভাবে আমি এই ভিবিএ ফাংশনটি ব্যবহার করি

  • =BASE64SHA1(A1)আপনি কোনও ভিবিএ মডিউলটিতে ম্যাক্রো অনুলিপি করার পরে এটি এক্সেলের সাথে ডেকে আনা হয়েছে
  • নেট দরকার কারণ এটি "মাইক্রোসফ্ট এমএসএক্সএমএল" লাইব্রেরিটি ব্যবহার করে (দেরীতে বাধ্য হয়ে)

Public Function BASE64SHA1(ByVal sTextToHash As String)

    Dim asc As Object
    Dim enc As Object
    Dim TextToHash() As Byte
    Dim SharedSecretKey() As Byte
    Dim bytes() As Byte
    Const cutoff As Integer = 5

    Set asc = CreateObject("System.Text.UTF8Encoding")
    Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")

    TextToHash = asc.GetBytes_4(sTextToHash)
    SharedSecretKey = asc.GetBytes_4(sTextToHash)
    enc.Key = SharedSecretKey

    bytes = enc.ComputeHash_2((TextToHash))
    BASE64SHA1 = EncodeBase64(bytes)
    BASE64SHA1 = Left(BASE64SHA1, cutoff)

    Set asc = Nothing
    Set enc = Nothing

End Function

Private Function EncodeBase64(ByRef arrData() As Byte) As String

    Dim objXML As Object
    Dim objNode As Object

    Set objXML = CreateObject("MSXML2.DOMDocument")
    Set objNode = objXML.createElement("b64")

    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    EncodeBase64 = objNode.text

    Set objNode = Nothing
    Set objXML = Nothing

End Function

হ্যাশের দৈর্ঘ্য কাস্টমাইজ করা

  • হ্যাশটি প্রাথমিকভাবে একটি 28 টি অক্ষরের দীর্ঘ ইউনিকোড স্ট্রিং (কেস সেনসিটিভ + বিশেষ অক্ষর)
  • আপনি এই লাইনের সাথে হ্যাশের দৈর্ঘ্য কাস্টমাইজ করুন: Const cutoff As Integer = 5
  • 6879 লাইনে 4 অঙ্কের হ্যাশ = 36 সংঘর্ষ = 0.5% সংঘর্ষের হার
  • 6895 লাইনে 5 সংখ্যার হ্যাশ = 0 সংঘর্ষ = 0% সংঘর্ষের হার

এছাড়াও হ্যাশ ফাংশন রয়েছে ( তিনটি সিআরসি 16 ফাংশন ) যার জন্য। নেট প্রয়োজন হয় না এবং বাহ্যিক লাইব্রেরি ব্যবহার করে না। তবে হ্যাশ দীর্ঘতর এবং আরও সংঘর্ষের জন্ম দেয়।

আপনি কেবল এই উদাহরণস্বরূপ ওয়ার্কবুকটি ডাউনলোড করতে এবং সমস্ত 5 টি হ্যাশ বাস্তবায়নের সাথে ঘুরে দেখতে পারেন। আপনি যেমন দেখেন প্রথম শীটে একটি ভাল তুলনা আছে


1
দুর্দান্ত লাগছে। তবে এক্সেলের ফিরে আসতে বাধা দেওয়ার মতো পর্যাপ্ত ভিবিএ অভিজ্ঞতা আমার নেই #NAME?। কোডটি দেখুন> নতুন উইন্ডোতে কোড কাটা এবং পেস্ট করুন - নেভিগেটরে সঠিক ওয়ার্কশিটের মধ্যে> ম্যাক্রো-সক্ষমকৃত ওয়ার্কশিট হিসাবে সংরক্ষণ করুন> বন্ধ করুন এবং এক্সেলটিতে ফিরে যান ... আর কিছু মিস করছি না? আমার কি এটি কোনওভাবে সংকলন করা দরকার?
dwwilson66

হ্যাঁ ... স্পষ্ট করার জন্য ... আমি ওয়ার্কশিট ট্যাবে গিয়ে কোডটি দেখুন> কোডটি দেখুন ... এখনই নমুনাটি ডাউনলোড করা হচ্ছে, তবে আমি বুঝতে চাই যে কেন এক্সেল আমার কোডটিকে স্বীকৃতি দেয় না?
dwwilson66

ওহোহো ... নমুনা শীট সাহায্য করেছে। বুঝতে পেরেছি আমি কোডটি পেস্ট করেছি এবং মডেল উইন্ডো নয়, ওবিজেইসিটি উইন্ডোতে এক্সেল করব। আমি এখন আমার ওয়ার্কবুকে হ্যাশ পাচ্ছি!
dwwilson66

1
এটি একটি দুর্দান্ত সরঞ্জাম।
জে কিলেন

1
আপনি cutoffপ্যারামিটারাইজড এবং upচ্ছিকটিকে অন্য ডিফল্ট দিয়ে ফাংশন প্যারামিটার তালিকায় Public Function BASE64SHA1(ByVal sTextToHash As String, Optional ByVal cutoff As Integer = 8) নিয়ে গিয়ে ফাংশনের অভ্যন্তরে ঘোষণাটি সরিয়ে ফেলতে পারেন।
কোর

9

আমি সংঘর্ষের বিষয়ে খুব বেশি যত্ন নিই না, তবে ভেরিয়েবল-দৈর্ঘ্যের স্ট্রিংয়ের ক্ষেত্রের উপর ভিত্তি করে সারিগুলির দুর্বল সিউডোরডোমাইজারের প্রয়োজন। এখানে একটি পাগল সমাধান যা ভালভাবে কাজ করেছে:

=MOD(MOD(MOD(MOD(MOD(IF(LEN(Z2)>=1,CODE(MID(Z2,1,1))+10,31),1009)*IF(LEN(Z2)>=3,CODE(MID(Z2,3,1))+10,41),1009)*IF(LEN(Z2)>=5,CODE(MID(Z2,5,1))+10,59),1009)*IF(LEN(Z2)>=7,CODE(MID(Z2,7,1))+10,26),1009)*IF(LEN(Z2)>=9,CODE(MID(Z2,9,1))+10,53),1009)

Z2আপনি হ্যাশ করতে চান এমন স্ট্রিং সহ এমন কোষটি কোথায় রয়েছে।

"এমওডি" রয়েছে বৈজ্ঞানিক স্বরলিপিতে প্রবাহিত হওয়া রোধ করতে। 1009একটি প্রধান, এক্স কিছু ব্যবহার করতে পারে যাতে এক্স * 255 < max_int_size। 10 নির্বিচারে হয়; কিছু ব্যবহার করুন। "অন্য" মানগুলি নির্বিচারে (পাই এর অঙ্কগুলি এখানে!); কিছু ব্যবহার করুন। অক্ষরের অবস্থান (1,3,5,7,9) নির্বিচারে; কিছু ব্যবহার করুন।


2
সত্যিই এটি সহজ উত্তর, আমি সন্দেহ করি সংঘর্ষগুলি বেশিরভাগ এক্সেল ব্যবহারের ক্ষেত্রে সমস্যা are
রোলগুলি

3

যুক্তিসঙ্গতভাবে ছোট তালিকার জন্য আপনি বিল্ট-ইন এক্সেল ফাংশনগুলি ব্যবহার করে একটি স্ক্র্যামبلার (দরিদ্র লোকের হ্যাশ ফাংশন) তৈরি করতে পারেন।

যেমন

 =CODE(A2)*LEN(A2) + CODE(MID(A2,$A$1,$B$1))*LEN(MID(A2,$A$1,$B$1))

এখানে এ 1 এবং বি 1 এলোমেলো শুরুর অক্ষর এবং স্ট্রিং দৈর্ঘ্য ধারণ করে।

কিছুটা ফিডিং এবং চেকিং এবং বেশিরভাগ ক্ষেত্রে আপনি খুব দ্রুত একটি কার্যক্ষম অদ্বিতীয় আইডি পেতে পারেন।

এটি কীভাবে কাজ করে : সূত্রটি স্ট্রিংয়ের প্রথম অক্ষর এবং মিড-স্ট্রিং থেকে নেওয়া একটি নির্দিষ্ট অক্ষর ব্যবহার করে এবং সংঘর্ষের সম্ভাবনা হ্রাস করতে LEN () কে 'ফ্যানিং ফাংশন' হিসাবে ব্যবহার করে।

সতর্কীকরণ : এই হল না একটি হ্যাশ, কিন্তু আপনি কিছু দ্রুত সম্পন্ন পেতে প্রয়োজন, এবং কোন দুর্ঘটনায় আছে দেখতে ফলাফল পরিদর্শন করতে পারেন, এটা বেশ ভাল কাজ করে।

সম্পাদনা করুন: যদি আপনার স্ট্রিংগুলির পরিবর্তনশীল দৈর্ঘ্য হওয়া উচিত (যেমন সম্পূর্ণ নাম) তবে নির্দিষ্ট প্রস্থের ক্ষেত্রগুলি সহ একটি ডাটাবেস রেকর্ড থেকে টানা থাকে, আপনি এটি এটি করতে চাইবেন:

 =CODE(TRIM(C8))*LEN(TRIM(C8))
       +CODE(MID(TRIM(C8),$A$1,1))*LEN(MID(TRIM(C8),$A$1,$B$1))

যাতে দৈর্ঘ্যগুলি অর্থবহ স্ক্র্যাম্বেলার হয়।


1
দুর্দান্ত উত্তর! (: "দরিদ্র ব্যক্তির হ্যাশ ফাংশন", "ক্যাভিয়েট", "এটি কীভাবে কাজ করে" :)
বাদামি সম্পর্কে

1
করতে "কোন দুর্ঘটনায় আছে দেখতে ফলাফল পরিদর্শন" আপনি কেবল চেষ্টা করে দেখতে পারেন / পরীক্ষা এই তথ্য> অপসারণ সদৃশ চলমান দ্বারা এবং যদি থেকে থাকে তাহলে দেখুন। [স্পষ্টত / সম্ভবতঃ, যদি আপনি মিস্টার ডুপ্লিকেটগুলি করেন তবে ডুপ্লিকেটগুলি না পাওয়া অবধি এই পুনরাবৃত্তভাবে কেবলমাত্র উপরের ফাংশনটি পুনরায় চালাতে পারবেন]
ন্যাটি সম্পর্কে

2

আমি এটি ব্যবহার করছি যা প্রতিবার স্ক্রিপ্ট চালানোর প্রয়োজন ছাড়াই সংঘর্ষ প্রতিরোধের সাথে বেশ ভাল ফলাফল দেয়। আমার 0 - 1 এর মধ্যে একটি মান প্রয়োজন।

=ABS(COS((CODE(MID(A2,ROUNDUP(LEN(A2)/9,0),1))*(CODE(MID(A2,ROUNDUP(LEN(A2)/5,0),1))+100)/CODE(MID(A2,ROUNDUP(LEN(A2)/3,0),1))*(CODE(MID(A2,ROUNDUP(LEN(A2)*8/9,0),1))+25)/CODE(MID(A2,ROUNDUP(LEN(A2)*6/9,0),1))*(CODE(MID(A2,ROUNDUP(LEN(A2)*4/9,0),1))-25))/LEN(A2)+CODE(A2)))

এটি স্ট্রিং জুড়ে চিঠিগুলি নিয়ে আসে, সেই প্রতিটি বর্ণের মান নেয়, একটি মান যুক্ত করে (একই জায়গায় একই বর্ণগুলি একই ফলাফল দেয়াকে প্রতিরোধ করতে), প্রতিটিকে গুণিত / ভাগ করে এবং মোটের উপর একটি সিওএস ফাংশন চালায়।


1

আপনি এটি চেষ্টা করতে পারেন। দুটি কলামে সিউডো # চালান:

=, + তাহলে (এবং (ISBLANK (D3 তে), ISBLANK (E3)), "", কোড (Trim (D3 তে & E3)) * LEN এর (Trim (D3 তে & E3)) + code (মধ্য (Trim (D3 তে & E3),, $ A $ 1 * LEN এর (ডি 3 এবং ই 3), 1)) আইএনটি (লেন (ট্রিম (ডি 3 এবং ই 3)) $ বি $ 1)

যেখানে এ 1 এবং বি 1 স্টোর এলোমেলো বীজ ম্যানুয়ালি প্রবেশ করেছে: 0


0

আমার জানা মতে এক্সলে কোনও হ্যাশ ফাংশন বিল্ড নেই - আপনাকে ভিবিএতে একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন হিসাবে তৈরি করতে হবে।

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


হ্যাঁ ... আমি এটি জানি, তবে কেবল উপস্থাপনের দিক থেকে আমি বলব, 15 বাইট হ্যাশ যে 256 বাইট titleআমার হিমায়িত বাম প্যানে ...
dwwilson66
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.