একটি স্ট্রিংকে 8 ডিজিটে হ্যাশ করবেন কীভাবে?


109

যে কোনও উপায়ে আমি নিজেই কোনও অ্যালগোরিদম বাস্তবায়ন না করে 8 টি সংখ্যায় একটি এলোমেলো স্ট্রিং হ্যাশ করতে পারি?


4
হ্যাশ ("আপনার স্ট্রিং")% 100000000
থেরান

4
8 ডিজিটটি ছোট বলে মনে হচ্ছে এবং যদি আপনার কাছে প্রচুর রেকর্ড থাকে তবে হ্যাশগুলির সংঘর্ষের ফলাফল হতে পারে। stackoverflow.com/questions/1303021/...
DhruvPathak

হ্যাশলিব ব্যবহার করুন যেহেতু হ্যাশটির অন্য উদ্দেশ্য রয়েছে!
আর্কিটেকোনিক

4
যেকোন অঙ্কের সীমাবদ্ধতার ফলে যথেষ্ট পরিমাণে হ্যাশ আইটেমের সংঘর্ষ ঘটতে পারে, এজন্য আপনার এগুলি অনন্য কী হিসাবে ধরা উচিত নয় - এটি জন্মদিনের সমস্যায় পরিণত হয়।
অ্যালেক্স উত্তর-কীগুলি

4
আমি "সিটিহ্যাশ" কে হ্যাশ স্ট্রিংয়ের জন্য 19 অঙ্কের দীর্ঘ পূর্ণসংখ্যার (64৪ বিট পূর্ণসংখ্যার) পছন্দ করেছি, এই আশায় যে এটি নীচে রেমন্ডের পরামর্শের চেয়ে কম সম্ভাব্য সংঘর্ষের দিকে পরিচালিত করবে। en.wikipedia.org/wiki/List_of_hash_functions
tryptofame

উত্তর:


160

হ্যাঁ, আপনি অন্তর্নির্মিত হ্যাশলিব মডিউল বা বিল্ট-ইন হ্যাশ ফাংশন ব্যবহার করতে পারেন । তারপরে, মডুলো অপারেশন বা স্ট্রিং স্লাইসিং ক্রিয়াকলাপগুলি হ্যাশের পূর্ণসংখ্যা আকারে ব্যবহার করে শেষ আটটি সংখ্যা কেটে ফেলুন:

>>> s = 'she sells sea shells by the sea shore'

>>> # Use hashlib
>>> import hashlib
>>> int(hashlib.sha1(s).hexdigest(), 16) % (10 ** 8)
58097614L

>>> # Use hash()
>>> abs(hash(s)) % (10 ** 8)
82148974

30
পাবলিক সার্ভিস ঘোষণা ... এই কৌশলটি আসলে স্ট্রিংয়ের জন্য একটি অনন্য হ্যাশ মানের ফল দেয় না; এটি একটি হ্যাশ গণনা করে এবং তারপরে একটি অ-গ্যারান্টিযুক্ত-অনন্য মূল্যতে পরিণত হয়
দ্বিগুণ

90
পাবলিক সার্ভিস ঘোষণা ... সীমিত ইনপুট মানগুলির উপর নিখুঁত হ্যাশগুলির বিশেষ ক্ষেত্রে ব্যতীত হ্যাশ ফাংশনগুলি গ্যারান্টিযুক্ত অনন্য মান উত্পন্ন করার কথা নয়।
রেমন্ড হেটেঞ্জার

5
আপনি ওপির প্রশ্নটি পড়েছেন? তিনি (বা তিনি) 8 দশমিক স্থান চেয়েছিলেন (বা প্রয়োজন)। এছাড়াও, যেভাবে হ্যাশ টেবিলগুলি কাজ করে তা হ্যাশ করা একটি ছোট অনুসন্ধানের জায়গায় (স্পারস টেবিল)। আপনি জানেন না যে হ্যাশ ফাংশনগুলি সাধারণত ব্যবহৃত হয় এবং আসল প্রশ্নটি জিজ্ঞাসা করা হয়নি সে সম্পর্কে যত্নশীল না করে used
রেমন্ড হেটেঙ্গার

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

20
সাবধান, হ্যাশ গুলি গুলি প্ল্যাটফর্ম এবং রান জুড়ে একই ফলাফল দেওয়ার গ্যারান্টিযুক্ত নয়।
মিঃ নাপিক

99

পাইথন 2 এর জন্য রেমন্ডের উত্তর দুর্দান্ত (যদিও আপনাকে অ্যাবস () বা 10 ** 8 এর কাছাকাছি প্যারেন্সের দরকার নেই)। যাইহোক, পাইথন 3 এর জন্য, এখানে গুরুত্বপূর্ণ সতর্কতা রয়েছে। প্রথমত, আপনাকে নিশ্চিত করতে হবে যে আপনি কোনও এনকোডযুক্ত স্ট্রিংটি পার করছেন। এই দিনগুলিতে, বেশিরভাগ পরিস্থিতিতে শ -১ থেকে দূরে সরে যাওয়ার পরিবর্তে শ -২ 25 like এর মতো কিছু ব্যবহার করা আরও ভাল। সুতরাং, হ্যাশলিব পদ্ধতিটি হ'ল:

>>> import hashlib
>>> s = 'your string'
>>> int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) % 10**8
80262417

আপনি যদি পরিবর্তে হ্যাশ () ফাংশনটি ব্যবহার করতে চান তবে গুরুত্বপূর্ণ সতর্কতাটি হ'ল পাইথন ২.x এর থেকে পৃথক পাইথন ৩.x এর মধ্যে, হ্যাশ () এর ফলাফলটি কেবলমাত্র একটি প্রক্রিয়ার মধ্যেই সামঞ্জস্যপূর্ণ হবে, পাইথন ডাকে না across এখানে দেখো:

$ python -V
Python 2.7.5
$ python -c 'print(hash("foo"))'
-4177197833195190597
$ python -c 'print(hash("foo"))'
-4177197833195190597

$ python3 -V
Python 3.4.2
$ python3 -c 'print(hash("foo"))'
5790391865899772265
$ python3 -c 'print(hash("foo"))'
-8152690834165248934

এর অর্থ হ্যাশ () - ভিত্তিক সমাধান প্রস্তাবিত, যা কেবল সংক্ষিপ্ত করা যেতে পারে:

hash(s) % 10**8

প্রদত্ত স্ক্রিপ্ট রানের মধ্যে কেবল একই মানটি প্রদান করবে:

#Python 2:
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543
$ python2 -c 's="your string"; print(hash(s) % 10**8)'
52304543

#Python 3:
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
12954124
$ python3 -c 's="your string"; print(hash(s) % 10**8)'
32065451

সুতরাং, আপনার অ্যাপ্লিকেশনটির ক্ষেত্রে এটি (যদি তা আমার ক্ষেত্রে ঘটে) এর উপর নির্ভর করে আপনি সম্ভবত হ্যাশলিব ভিত্তিক পদ্ধতির সাথে লেগে থাকতে চাইবেন।


4
এটি লক্ষ করা উচিত যে পাইথন ৩.৩ থেকে টর পিটিং থেকে রক্ষা করার জন্য পাইথন ৩.৩ এর পর থেকে এই উত্তরটির একটি অত্যন্ত গুরুত্বপূর্ণ সতর্কতা রয়েছে এবং তারপরে স্টার্টআপের সময় এলোমেলো হ্যাশ বীজ ব্যবহার করুন।
ওল্ফ

অঙ্কগুলি যদি আপনার মূল প্রয়োজন না হয় তবে আপনি hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]ডাইনি ব্যবহার করতে পারেন তারপরেও সংঘর্ষ হবে
লনি

তাদের বাক্সে রাখা উচিত!
টমাসজ

3

জেজেসি উত্তরটি সম্পূর্ণ করতে, অজগর 3.5.3 এ আপনি যদি এইভাবে হ্যাশলিব ব্যবহার করেন তবে আচরণটি সঠিক:

$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded
$ python3 -c '
import hashlib
hash_object = hashlib.sha256(b"Caroline")
hex_dig = hash_object.hexdigest()
print(hex_dig)
'
739061d73d65dcdeb755aa28da4fea16a02b9c99b4c2735f2ebfa016f3e7fded

$ python3 -V
Python 3.5.3

-3

@ রেইমন্ড হেট্টিংগার দ্বারা প্রয়োগ করা সমাধানের নোডেজ বাস্তবায়নটি আমি ভাগ করে নিচ্ছি।

var crypto = require('crypto');
var s = 'she sells sea shells by the sea shore';
console.log(BigInt('0x' + crypto.createHash('sha1').update(s).digest('hex'))%(10n ** 8n));

আপনি অজগর সম্পর্কে একটি প্রশ্নে একটি নোডেজ সমাধান ভাগ করছেন?
হারাবেক

হ্যাঁ, আমরা যখন সিস্টেমটি তৈরি করছিলাম - ব্যাকএন্ডটি অজগরটি ব্যবহার করে প্রক্রিয়া করত যখন সম্মুখভাগ নোড.জেএস ব্যবহার করত। উভয়ই নির্বিঘ্নে কাজ করা নিশ্চিত করা দরকার।
ব্যবহারকারী 923227
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.