क्या ऐसा भी है कि मैं किसी भी एल्गोरिदम को लागू किए बिना 8 अंकों की संख्या में एक यादृच्छिक स्ट्रिंग हैश कर सकता हूं?
क्या ऐसा भी है कि मैं किसी भी एल्गोरिदम को लागू किए बिना 8 अंकों की संख्या में एक यादृच्छिक स्ट्रिंग हैश कर सकता हूं?
जवाबों:
हां, आप अंतर्निहित हैशलीब मॉड्यूल या बिल्ट-इन हैश फ़ंक्शन का उपयोग कर सकते हैं । फिर, हैश के पूर्णांक रूप पर मोडुलो संचालन या स्ट्रिंग स्लाइसिंग ऑपरेशन का उपयोग करके पिछले आठ अंकों को काटें:
>>> 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
रेमंड का जवाब 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
इसलिए, इस बात पर निर्भर करता है कि आपके आवेदन में यह मायने रखता है (यह मेरा काम किया है), आप शायद हैशलिब-आधारित दृष्टिकोण से चिपके रहना चाहते हैं।
hashlib.sha256("hello world".encode('utf-8')).hexdigest()[:8]
चुड़ैल का उपयोग भी कर सकते हैं फिर भी टकराव होगा
बस जेजेसी जवाब को पूरा करने के लिए, अजगर 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
मैं @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));