मेरा समाधान यहां है।
एक तीन भाग x-y-z है जहां x टाइमस्टैम्प है, y यादृच्छिक कोड और z एक्स और वाई के संयोजन द्वारा उत्पादित चेक अंक है। लेकिन सरल करने के लिए (यह छोटे), x और y संख्यात्मक आधार 10 के बजाय कोई कस्टम आधार में दिए गए हैं, लेकिन अभी भी जेड आधार पर दिया जाता है आईडी आप इस दृष्टिकोण के साथ प्राप्त कर सकते हैं की 10
उदाहरण:
- LP9NTX-8D41-QW6R-9
- LP9NTY-5H3L-BFS7-5
- LP9NTZ-RWL3-D619-8
- LP9NVB-BW74-788W-6
- LP9NVW-G17D-4911- 8
तो आप टाइमस्टैम्प द्वारा सॉर्ट कर सकते हैं (ध्यान दें कि यह 'वृद्धिशील अल्फान्यूमेरिक' ऑर्डर में कैसे जाता है, अगर आपको पता नहीं है कि संख्यात्मक आधार क्या है)।
इसके लिए मैंने base58 के अंकों + अपरकेस अक्षरों का उपयोग किया (अंत में इससे कोई फर्क नहीं पड़ता कि मैं लोअरकेस या ऊपरी उपयोग करता हूं), जो कुछ भ्रमित पात्रों के बिना बेस 62 है। Flickr, bit.ly and others use base58 for making Twitter 'friendly' links and the like।
Verhoeff :: नीचे कैल्शियम Verhoeff’s Dihedral Group D5 Check by Dahnielson. एकमात्र संपादन मैंने अपना कोड कक्षा के अंदर रखना था, इसलिए यह वही है।
यहाँ कुछ कोड है: (* कुछ हद तक है कि मैं क्या लाइनों पर वहाँ^का वादा किया गया है से संशोधित)
<?php
$time_divisor = 3;
$base = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";//consider using another base **see note below**
$lower_limit = 50000;//just to avoiding to confuse the user with a lower number
$upper_limit = 1291467968;//1291467968 == ZZZZZZ in this base I used
//you can check the limit with base_decode("ZZZZZZ", $base);
$ptime = (int)($_SERVER['REQUEST_TIME']/$time_divisor);//or time();
$rand1 = mt_rand($lower_limit, $upper_limi);
$rand2 = mt_rand($lower_limit, $upper_limi);
$ptime_b = base_encode($time, $base);
$rand1_b = base_encode($rand1, $base);
$rand2_b = base_encode($rand2, $base);
$order_id = $ptime_b.$rand1_b.$rand2_b.Verhoeff::calcsum($time.$rand1.$rand2);
echo $order_id;
?>
बस के बाद मैं इस लेखन गलत हो रहा चीजों की एक और संभवतः मेरे मन में आया था समाप्त हो गया। मुझे याद आया कि आप नहीं चाहते हैं कि आपके उपभोक्ताओं का अपमान हो। तो यहां तक कि 'एफ? सीके' या '4एसएस' जैसे बुरे शब्द भी अंततः ठीक दिख रहे हैं (और वे लगभग निश्चित रूप से करेंगे), स्पष्ट शब्द (पिछले शब्द में 'ए' के लिए '4' को बदलने में) निश्चित रूप से नहीं हैं । इस वजह से मैं निम्नलिखित वैकल्पिक आधार/UPPER_LIMIT बजाय का उपयोग करने की सलाह देते हैं:
<?php
$lower_limit = 27000;//=2111
$upper_limit = 809999;//=ZZZZ
$base = "123456789BCDFGHJKLMNPQRSTVWXYZ";//erased -a -e -u
?>
कृपया ध्यान दें कि अगर आप बड़ा नंबरों का उपयोग करने की कोशिश आप mt_rand सीमा के रूप में रूप में अच्छी तरह PHP के ऊपरी पूर्णांक सीमा तक पहुँच जाएगा, जो कर सकते हैं mt_getrandmax() के साथ देखा जाना चाहिए। साथ ही, मैं यह कहना चाहूंगा कि जो मैं देखता हूं उसके लिए mt_rand की एन्ट्रॉपी पर्याप्त है।
यदि आपको यादृच्छिक भाग के लिए बड़ी संख्या की आवश्यकता है तो मैं केवल तीसरे भाग को mt_rand (i, j) जैसे कुछ जोड़ने के लिए अनुशंसा करता हूं; जहां i और j आपके आधार के लिए न्यूनतम और अधिकतम मान हैं जो आपकी ऑर्डर आईडी को $ num-chars लंबाई में बढ़ाएंगे (वास्तव में मैंने इसे बनाया है, ऊपर/विन्यास कॉन्फ़िगरेशन)।
और डीबी पक्ष में टकराव से बचने के लिए यह एक अद्वितीय क्षेत्र है।
सभी को धन्यवाद।
"एक PHP या इस समस्या को हल करने के लिए डिज़ाइन किया गया कोड की MySQL टुकड़ा मुझे के लिए मान्य उत्तर पर विचार किया जाएगा" - यह है कि कह का एक और तरीका "कृपया sendz तेह codez "? –
नहीं, लेकिन अगर वहां कोई ऐसा व्यक्ति है जिसने एल्गोरिदम बनाया है जो हल करता है कि एक अच्छे तरीके से मैं आनंद लेता हूं। मैंने अपने इरादे के बारे में गलत सोचने वाले किसी और से बचने के लिए टेक्स्ट संपादित किया है। –