2010-07-31 19 views
28

php में स्ट्रिंग से एक अद्वितीय हैश देने का कोई तरीका है, लेकिन हैश केवल संख्याओं से बना था?php: संख्या केवल हैश?

उदाहरण:

return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6 

लेकिन मैं

return numhash(234); // returns 00978902923102372190 
(20 numbers only) 

जरूरत समस्या यहाँ है कि मैं हैशिंग कम होना चाहते हैं।

संपादित करें: ठीक है मुझे यहां वापस कहानी की व्याख्या करने दें। मेरे पास एक ऐसी साइट है जिसमें प्रत्येक पंजीकृत व्यक्ति के लिए आईडी है, मुझे व्यक्ति के उपयोग और विनिमय के लिए आईडी की आवश्यकता है (इसलिए यह बहुत लंबा नहीं हो सकता है), अब तक आईडी नंबरिंग 00001, 00002, 00003 आदि है। ...

  1. इस बनाता है कुछ लोगों को और अधिक महत्वपूर्ण
  2. इस आवेदन की जानकारी है कि मैं प्रकट करने के लिए नहीं करना चाहते हैं का पता चलता है देखो।

बिंदु 1 और 2 को ठीक करने के लिए मुझे अद्वितीय रखने के दौरान संख्या को "छिपाने" की आवश्यकता है।

उत्तर

56

PHP में एक MD5 या SHA1 हैश एक हेक्साडेसिमल संख्या देता है, इसलिए आपको केवल आधारों को कन्वर्ट करना है।

$bignum = hexdec(md5("test")); 

या

$bignum = hexdec(sha1("test")); 

PHP Manual for hexdec

चूंकि आप एक सीमित आकार संख्या चाहते हैं, आप तो मॉड्यूलर विभाजन इस्तेमाल कर सकते हैं एक में रख रहे हैं: पीएचपी एक समारोह है कि आप के लिए यह कर सकते हैं है आप चाहते हैं सीमा।

$smallnum = $bignum % [put your upper bound here] 

संपादित

टिप्पणी में Artefacto द्वारा बताया गया है, इस दृष्टिकोण का उपयोग कर PHP में एक पूर्णांक के अधिकतम आकार से परे एक नंबर का परिणाम देगा के रूप में, और मॉड्यूलर विभाजन के बाद परिणाम हमेशा 0 हो जाएगा हालांकि, हैश की एक सबस्ट्रिंग लेना जिसमें पहले 16 वर्ण हैं, में यह समस्या नहीं है। प्रारंभिक बड़ी संख्या की गणना के लिए संशोधित संस्करण:

$bignum = hexdec(substr(sha1("test"), 0, 15)); 
+0

क्या होगा यदि मैं 'परीक्षण' चर को सीमित संख्या में सीमित करता हूं? हैश आकार को कम करने का कोई तरीका होगा? –

+0

@YuriKolovsky - अंतिम हैश आकार दूसरे चरण में मॉड्यूलर विभाजन के लिए उपयोग किए जाने वाले ऊपरी बाउंड द्वारा निर्धारित किया जाएगा। उदाहरण के लिए, यदि आप चाहते हैं कि आपके हैंश सभी 5 अंकों के लिए हों, तो आप '$ smallnum = $ bignum% 99999' का उपयोग कर सकते हैं। प्रारंभिक एमडी 5 या एसएचए 1 हैश में जो भी रखा जाता है, इस पर ध्यान दिए बिना यह काम करेगा। – derekerdmann

+0

@ डेरेकरडमैन यह वही दिखता है जो मुझे चाहिए: डी –

1

सबसे पहले, एमडी 5 मूल रूप से समझौता किया गया है, इसलिए आपको किसी भी चीज़ के लिए इसका उपयोग नहीं करना चाहिए बल्कि गैर-महत्वपूर्ण हैशिंग। PHP5 में hash() फ़ंक्शन है, http://www.php.net/manual/en/function.hash.php देखें।

सही पैरामीटर को सही पर सेट करने से आपको बाइनरी डेटा की एक स्ट्रिंग मिल जाएगी। वैकल्पिक रूप से, आप परिणामी हेक्साडेसिमल हैश को 2 अक्षरों के टुकड़ों में विभाजित कर सकते हैं और उन्हें व्यक्तिगत रूप से पूर्णांक में परिवर्तित कर सकते हैं, लेकिन मैं अपेक्षा करता हूं कि यह बहुत धीमी हो।

+1

गति कोई मुद्दा नहीं है, मेरे पास एकमात्र मुद्दा यह है कि num हैश अद्वितीय हास्यास्पद रूप से लंबा नहीं है। –

14

आप crc32() कोशिश कर सकते हैं।crcकेवलvalidate the integrity of data करने के लिए इस्तेमाल किया जाना चाहिए, http://php.net/manual/en/function.crc32.php

$checksum = crc32("The quick brown fox jumped over the lazy dog."); 
printf("%u\n", $checksum); // prints 2191738434 
इसी के साथ

ने कहा: पर दस्तावेज़ देखें।

3

कुछ अच्छे उत्तर हैं लेकिन मेरे लिए दृष्टिकोण मूर्खतापूर्ण प्रतीत होते हैं।
वे पहले हेक्स नंबर बनाने के लिए PHP को मजबूर करते हैं, फिर बिगइंटर में इस बैक (hexdec) को परिवर्तित करें और फिर इसे कई अक्षरों में काट दें ... यह बहुत काम है!

इसके बजाय क्यों नहीं

हैश बाइनरी के रूप में पढ़ें:

$binhash = md5('[input value]', true); 

तो

$numhash = unpack('N2', $binhash); //- or 'V2' for little endian 

का उपयोग कर दो INT रों ($numhash दो तत्वों की एक सरणी है) के रूप में इस कास्ट करने के लिए। अब आप AND ऑपरेशन का उपयोग करके संख्या में बिट्स की संख्या को कम कर सकते हैं। उदाहरण:

$result = $numhash[1] & 0x000FFFFF; //- to get numbers between 0 and 1048575 

लेकिन टकराव की चेतावनी दी जानी चाहिए! संख्या को कम करने का अर्थ है एक ही आउटपुट के साथ दो अलग [इनपुट मूल्य] की संभावना में वृद्धि।

मुझे लगता है कि बायिजेक्टिव फ़ंक्शन के साथ "आईडी-क्रिप्टिंग" का बेहतर तरीका होगा। तो कोई टक्कर नहीं हो सकती! सरलतम के लिए तरह सिर्फ 0 से 25 तक अधिकतम इनपुट मूल्य सीमा के साथ एक Affine_cipher

उदाहरण का उपयोग करें:

function numcrypt($a) 
{ 
    return ($a * 15) % 26; 
} 

function unnumcrypt($a) 
{ 
    return ($a * 7) % 26; 
} 

आउटपुट:

numcrypt(1) : 15 
numcrypt(2) : 4 
numcrypt(3) : 19 

unnumcrypt(15) : 1 
unnumcrypt(4) : 2 
unnumcrypt(19) : 3 

उदा

$id = unnumcrypt($_GET('userid')); 

... do something with the ID ... 

echo '<a href="do.php?userid='. numcrypt($id) . '"> go </a>'; 
निश्चित रूप से

इस सुरक्षित नहीं है, लेकिन कोई भी अपने एन्क्रिप्शन के लिए इस्तेमाल किया विधि जानता है तो कोई सुरक्षा कारणों से तो इस तरह से तेजी से और टकराव सुरक्षित है।

+0

मुझे समझ में नहीं आता कि कोई हैश प्राप्त करने के लिए आपके दूसरे समाधान का उपयोग कैसे करें, क्या आप कुछ और बता सकते हैं? –

+0

यह हैश नहीं है लेकिन आप इसका उपयोग कर सकते हैं उदा। एक अद्वितीय "यादृच्छिक" संख्या में अपनी आईडी को कवर करने के लिए Blowfish। उपयोगकर्ता तब "आईडी + 1" की गणना करने में सक्षम नहीं है। अंत में आप इसे प्रॉक्सी मेथोड के रूप में उपयोग कर सकते हैं: आपके एपीपी का आंतरिक उपयोग "आईडी: 1,2,3, ..." लेकिन आप अपने उपयोगकर्ता को क्रिप्ट नंबर प्रदान करते हैं। कई बड़े पक्ष इस तरह से करते हैं: उदा। Google-कुकी एन्क्रिप्टेड आईडी हैं – Thomas

+0

आप 'अनपैक (' एन 2 ', ...)' सरणी को कैसे उलट सकते हैं (या पैक())? – Xeoncross

5

हैश काट की समस्या टकराव हैं, यह कोशिश से बचने के लिए:

return hexdec(crc32("Hello World")); 

crc32():

32-बिट की चक्रीय अतिरेक चेकसम बहुपद उत्पन्न लंबाई की str। इसका उपयोग आम तौर पर प्रसारित होने वाले डेटा की अखंडता को सत्यापित करने के लिए किया जाता है।

जो हमें 32 बिट्स का एक पूर्णांक, 32 बिट्स इंस्टॉलेशन में नकारात्मक, या 64 बिट्स में सकारात्मक देता है। यह पूर्णांक डेटाबेस में एक आईडी की तरह स्टोर किया जा सकता है। यह टकराव की समस्या नहीं है, क्योंकि यह 32 बिट्स वैरिएबल में फिट बैठता है, एक बार जब आप इसे hexdec() फ़ंक्शन के साथ दशमलव में परिवर्तित कर देते हैं।

0

hashid आज़माएं।
यह हैश एक प्रारूप में है जिसे आप परिभाषित कर सकते हैं। स्वरूपों में शामिल हैं कि कितने चरित्र, और किस चरित्र में शामिल हैं।
उदाहरण:
$ हैशिड्स-> एन्कोड (1);
वापस लौटाएगा "28630" आपके प्रारूप पर निर्भर करता है,

संबंधित मुद्दे