आपको कुछ ऐसा चाहिए होगा जो निर्माण द्वारा सही हो, यानी एक क्रमपरिवर्तन फ़ंक्शन:यह एक ऐसा फ़ंक्शन है जो एक-से-एक, एक पूर्णांक (आपके अनुक्रमिक काउंटर) से दूसरे में प्रतिवर्ती मानचित्रण करता है। कुछ उदाहरण (इनमें से कोई भी संयोजन भी होना चाहिए काम):
- कुछ बिट्स को इनवर्ट करना (f.i. एक XOR का उपयोग करना, ^ PHP में)
- बिट्स के स्थानों की अदला-बदली करना (($i &0xc)>> 2 | ($i &0x3) <<2), या बस सभी बिट्स के क्रम को उलट देना
- एक स्थिर मान मॉड्यूलो को अपनी अधिकतम सीमा में जोड़ना (यदि आप इसे ऊपर वाले के साथ जोड़ रहे हैं, तो दो का एक कारक होना चाहिए)
उदाहरण:यह फ़ंक्शन 0, 1, 2, 3, 5, .. को 13, 4, 12, 7, 15, .. में 15 तक की संख्या के लिए परिवर्तित करेगा:
$i=($input+97) & 0xf;
$result=((($i&0x1) << 3) + (($i&0xe) >> 1)) ^ 0x5;
संपादित करें
एक रैखिक सर्वांगसम जनरेटर (एलसीजी, जो आमतौर पर यादृच्छिक संख्या उत्पन्न करने के लिए उपयोग किया जाता है) का उपयोग करने का एक आसान तरीका होगा, जिसे फॉर्म के सूत्र द्वारा परिभाषित किया गया है:
X_n+1 = (a * X_n + c) mod m
अच्छे मूल्यों के लिए a, c और m के क्रम में X_0, X_1 .. X_m-1 में 0 और m-1 के बीच की सभी संख्याएँ बिल्कुल एक बार होंगी। अब आप एक रैखिक रूप से बढ़ते सूचकांक से शुरू कर सकते हैं, और अगला . का उपयोग कर सकते हैं एलसीजी अनुक्रम में आपकी "गुप्त" कुंजी के रूप में मान।
EDIT2
कार्यान्वयन:आप अपने स्वयं के एलसीजी पैरामीटर डिज़ाइन कर सकते हैं , लेकिन यदि आप इसे गलत पाते हैं तो यह पूरी श्रेणी को कवर नहीं करेगा (और इस प्रकार डुप्लीकेट हैं) इसलिए मैं यहां यह पेपर :
a = 16807, c = 0, m = 2147483647
यह आपको 2**31 की रेंज देता है। पैक () के साथ आप परिणामी पूर्णांक को एक स्ट्रिंग के रूप में प्राप्त कर सकते हैं, base64_encode() इसे एक पठनीय स्ट्रिंग बनाता है (6 महत्वपूर्ण वर्णों तक, प्रति बाइट 6 बिट) तो यह आपका कार्य हो सकता है:
substr(base64_encode(pack("l", (16807 * $index) % 2147483647)), 0, 6)