8

निम्नलिखित को ध्यान में रखते हुए:ई-कॉमर्स समाधान या भुगतान की गई वेब सेवा के लिए एक अच्छी ऑर्डर आईडी योजना क्या होगी?

ए) आप कुछ गोपनीयता चाहते हैं (जैसा कि आपको सभी को कितने ऑर्डर प्राप्त नहीं हुए हैं)।

बी) आप अंत में एक चेक अंक (उदाहरण के लिए, Verhoeff एल्गोरिदम का उपयोग करके) चाहते हैं ताकि आप आसानी से मिस्पाल्स बता सकें और बारकोड स्कैन करते समय त्रुटियों से निपटने में मदद कर सकें, यदि ऐसा है।

सी) आपको समय पर विचार करना होगा ताकि उपभोक्ता आदेशों का क्रम क्रमबद्ध कर सकें।

डी) क्या यह सभी संख्यात्मक या हेक्सडेक आदि होना चाहिए?

ई) कुछ ऐसा जो आपका उपभोक्ता फोन पर समर्थन टीम को कह सकता है और सुरक्षा चिंता के कारण कर्मचारियों को ई-मेल आदि के बिना आदेश की पहचान करने के लिए पर्याप्त है।

मुझे कुछ राय सुनना अच्छा लगेगा।

पीएस: इस समस्या को हल करने के लिए डिज़ाइन किए गए किसी भी एल्गोरिदम को भी मेरे लिए एक वैध उत्तर माना जाएगा।

+0

"एक PHP या इस समस्या को हल करने के लिए डिज़ाइन किया गया कोड की MySQL टुकड़ा मुझे के लिए मान्य उत्तर पर विचार किया जाएगा" - यह है कि कह का एक और तरीका "कृपया sendz तेह codez "? –

+0

नहीं, लेकिन अगर वहां कोई ऐसा व्यक्ति है जिसने एल्गोरिदम बनाया है जो हल करता है कि एक अच्छे तरीके से मैं आनंद लेता हूं। मैंने अपने इरादे के बारे में गलत सोचने वाले किसी और से बचने के लिए टेक्स्ट संपादित किया है। –

उत्तर

1

आप जो भी लंबाई देखते हैं उसकी यादृच्छिक स्ट्रिंग के बारे में कैसे? उन फ़ोनों का उपयोग करें जो फोन उद्देश्यों को पढ़ने के लिए अन्य पात्रों के साथ आसानी से उलझन में नहीं हैं। इसलिए प्रत्येक आदेश कॉल की तरह कुछ पर:

public static string GetRandomString(int length) 
    { 
     char[] chars = "ACDEFGHJKMNPQRTWXY34679".ToCharArray(); 
     var crypto = new RNGCryptoServiceProvider(); 
     var data = new byte[length]; 
     crypto.GetNonZeroBytes(data); 
     var result = new StringBuilder(length); 
     for (int i = 0; i < data.Length; i++) 
     { 
      result.Append(chars[data[i] % chars.Length]); 
     } 

     return result.ToString(); 
    } 

अनुमान 8 अक्षरों उपरोक्त विधि से लौटे एक 1/282429536481 मौका है। और आप एक अद्वितीय बाधा के साथ डीबी में अखंडता बनाए रखेंगे?

+0

"आदेशों के क्रम को क्रमबद्ध करने" के बारे में क्या? – Kevin

+0

मुझे लगता है कि आपके पास ऑर्डरडेट फ़ील्ड सही होगा? – JeremyWeir

0

आप GUID का उपयोग कर सकते हैं। इसे एक ग्राहक अनुकूल स्ट्रिंग में कम करने के लिए Base32 कनवर्टर के माध्यम से मूल्य चलाने के लायक होगा जिसके परिणामस्वरूप एजेड के 26 वर्ण और अंक 2-7

आपके अन्य मानदंडों को पूरा करने के लिए, आप एक जोड़ सकते हैं ग्रिड वैल्यू पर अंक की जांच करें, और आपको विशिष्टता की गारंटी देने और प्राकृतिक अनुक्रमण/सॉर्टिंग की अनुमति देने के लिए डेटाबेस में एक अलग वास्तविक वृद्धिशील क्रम संख्या की आवश्यकता होगी।

+0

आपको वास्तविक प्रविष्टि को वास्तव में सीमित करने के लिए केवल GUID के पहले कुछ वर्णों की आवश्यकता है, इस बात को देखें कि गिट को केवल 4 -5 वर्णों की आवश्यकता है ताकि विशिष्ट रूप से प्रतिबद्धता की पहचान हो सके। आप ग्राहकों से कुछ और पात्रों के लिए पूछते हैं जब तक कि आप उनके नाम से मेल नहीं खाते। –

5

मेरा समाधान यहां है।

एक तीन भाग 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 लंबाई में बढ़ाएंगे (वास्तव में मैंने इसे बनाया है, ऊपर/विन्यास कॉन्फ़िगरेशन)।

और डीबी पक्ष में टकराव से बचने के लिए यह एक अद्वितीय क्षेत्र है।

सभी को धन्यवाद।

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