8 अंकों में एक स्ट्रिंग कैसे करें?


106

क्या ऐसा भी है कि मैं किसी भी एल्गोरिदम को लागू किए बिना 8 अंकों की संख्या में एक यादृच्छिक स्ट्रिंग हैश कर सकता हूं?


2
हैश ("आपका तार")% 100000000
थेरान

2
8 अंक छोटा लगता है, और यदि आपके पास बड़ी संख्या में रिकॉर्ड हैं, तो हैश की टक्कर हो सकती है। stackoverflow.com/questions/1303021/…
ध्रुवपतक

हैशलीब का उपयोग करें क्योंकि हैश का एक और उद्देश्य है!
आर्किटेक्चरल

2
अंकों की किसी भी परिमित संख्या में पर्याप्त मात्रा में हैश आइटम के लिए टकराव होगा, यही कारण है कि आपको उन्हें अद्वितीय कुंजी के रूप में नहीं मानना ​​चाहिए - यह जन्मदिन की समस्या में बदल जाता है।
एलेक्स नॉर्थ-कीज

1
मैंने 19 अंकों के लंबे पूर्णांक (64 बिट पूर्णांकों) को हैश स्ट्रिंग्स के लिए "सिटीहैश" चुना है, उम्मीद है कि यह नीचे रेमंड के सुझाव से कम संभावित टकराव को जन्म देगा। en.wikipedia.org/wiki/List_of_hash_functions
ट्रिप्टोफैम

जवाबों:


155

हां, आप अंतर्निहित हैशलीब मॉड्यूल या बिल्ट-इन हैश फ़ंक्शन का उपयोग कर सकते हैं । फिर, हैश के पूर्णांक रूप पर मोडुलो संचालन या स्ट्रिंग स्लाइसिंग ऑपरेशन का उपयोग करके पिछले आठ अंकों को काटें:

>>> 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

26
सार्वजनिक सेवा की घोषणा ... यह तकनीक वास्तव में स्ट्रिंग के लिए एक अद्वितीय हैश मान में परिणाम नहीं करती है; यह एक हैश की गणना करता है और फिर एक गैर-गारंटी-अद्वितीय मूल्य में बदल जाता है
twneale

88
सार्वजनिक सेवा की घोषणा ... इनपुट मूल्यों के सीमित सेट पर सही हैश के विशेष मामले को छोड़कर, हैश फ़ंक्शंस गारंटीकृत अद्वितीय मान उत्पन्न करने वाले नहीं हैं।
रेमंड हेटिंगर

5
क्या आपने ओपी के सवाल को पढ़ा? वह (या वह) 8 दशमलव स्थानों को चाहता था (या आवश्यक)। इसके अलावा, जिस तरह से हैश टेबल का काम एक छोटे से खोज स्थान (स्पार्स टेबल) में हैश करने का है। आपको पता नहीं लगता है कि हैश फ़ंक्शन आमतौर पर उपयोग किए जाते हैं और जो वास्तविक प्रश्न पूछा गया था, उसकी परवाह नहीं करते हैं।
रेमंड हेटिंगर

17
मैंने प्रश्न पढ़ा। मैं केवल यह देख रहा हूं कि SHA-1 के समान इनपुट स्पेस पर, आपका उत्तर खगोलीय रूप से टकराव पैदा करने की संभावना अधिक है। प्रश्न के लिए कम से कम कुछ विशिष्टता की आवश्यकता होती है, लेकिन आपका जवाब उसी भावना के साथ एक हैश फ़ंक्शन है जो केवल प्रत्येक इनपुट के लिए 12345678 देता है। मैं प्रायोगिक रूप से इस पद्धति का उपयोग करके 1000 से अधिक इनपुट के साथ टकराव उत्पन्न करने में सक्षम था। SHA-1 के समान टकराव की संभावना को संरक्षित करने के लिए, आपको un-truncated SHA-1 के 8-अंकीय पूर्णांक को मैप करना होगा। मुझे लगता है कि यह पीएसए के योग्य है
ट्वेनियाल

20
सावधान, हैश (s) प्लेटफार्मों और रनों के समान परिणाम देने के लिए निर्देशित नहीं है।
श्री नेपिक

94

रेमंड का जवाब python2 के लिए बहुत अच्छा है (हालांकि, आपको एब्स की आवश्यकता नहीं है) (और न ही 10 ** 8 के आसपास के पार्न्स)। हालांकि, python3 के लिए, महत्वपूर्ण कैवेट हैं। सबसे पहले, आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप एन्कोडेड स्ट्रिंग पास कर रहे हैं। इन दिनों, ज्यादातर परिस्थितियों में, शायद यह भी बेहतर है कि sha-1 को छोड़ दें और sha-256 जैसी किसी चीज़ का उपयोग करें। तो, हैशलीब दृष्टिकोण होगा:

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

यदि आप इसके बजाय हैश () फ़ंक्शन का उपयोग करना चाहते हैं, तो महत्वपूर्ण चेतावनी यह है कि, पायथन 2.x के विपरीत, पायथन 3.x में, हैश () का परिणाम केवल एक प्रक्रिया के भीतर संगत होगा, न कि पायथन एडोकेशन पर। यहाँ देखें:

$ 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

इसलिए, इस बात पर निर्भर करता है कि आपके आवेदन में यह मायने रखता है (यह मेरा काम किया है), आप शायद हैशलिब-आधारित दृष्टिकोण से चिपके रहना चाहते हैं।


2
यह ध्यान दिया जाना चाहिए कि इस जवाब में पायथन 3.3 के बाद से एक बहुत ही महत्वपूर्ण चेतावनी है, टार-पाइटिंग पायथन 3.3 के खिलाफ और स्टार्टअप पर एक यादृच्छिक हैश बीज का उपयोग करने के लिए।
वोल्फ

यदि अंक आपकी मुख्य आवश्यकता नहीं हैं, तो आप hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]चुड़ैल का उपयोग भी कर सकते हैं फिर भी टकराव होगा
lony

उन्हें बॉक्स पर रखना चाहिए!
टोमाज़

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

मैं @Raymond Hettinger द्वारा कार्यान्वित समाधान के हमारे नोडज कार्यान्वयन को साझा कर रहा हूं।

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));

आप अजगर के बारे में एक सवाल में एक नोडज समाधान साझा कर रहे हैं?
हरबेक

हां, जब हम सिस्टम का निर्माण कर रहे थे - बैकएंड ने इसे अजगर का उपयोग करके संसाधित किया, जबकि फ्रंट ने नोड का उपयोग किया। js. यह सुनिश्चित करने की आवश्यकता है कि दोनों कार्य निर्बाध रूप से हों।
उपयोगकर्ता 923227
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.