के साथ पोस्टग्रेस्क्ल में अद्वितीय यादृच्छिक संख्याएं उत्पन्न करें मुझे पोस्टग्रेस्क्ल में 13 अंकों की निश्चित लंबाई के साथ अद्वितीय यादृच्छिक संख्याएं उत्पन्न करने की आवश्यकता है। मुझे एक समान thread मिला है जहां "pseudo_encrypt" का उपयोग करके एन्क्रिप्टेड अनुक्रम का उपयोग किया गया था, लेकिन लौटा हुआ नंबर निश्चित लंबाई के साथ नहीं था।निश्चित लंबाई
तो, मैं क्या जरूरत है: 13 अंकों जहां न्यूनतम मूल्य 0000000000001 है की एक निश्चित लंबाई और एक अधिकतम मूल्य के साथ एक एन्क्रिप्टेड यादृच्छिक अनुक्रम मिल 9999999999999.
है यह संभव है? यदि सामने के शून्य से शुरू करना संभव नहीं है, तो मुझे कोई बड़ी समस्या नहीं है (मुझे लगता है), मैं उन्हें डीबी से पढ़ने के दौरान प्रोग्रामेटिक रूप से सेट कर सकता हूं, लेकिन अगर पोस्टग्रेस्क्ल इसे स्वयं कर सकता है तो अच्छा होगा।
- संपादित करें -
के बाद कुछ उपयोगी चीजें मैं प्रश्न में परिवर्तन करना होगा क्रम में बेहतर समझाने के लिए मैं क्या जरूरत है एहसास हो गया:
मैं साथ Postgresql में अद्वितीय यादृच्छिक संख्या (bigint) उत्पन्न करने के लिए की जरूरत है 13 अंकों की एक निश्चित अधिकतम लंबाई। असल में मैं pseudo_encrypt फ़ंक्शन (64 बिट) का उपयोग करने की कोशिश कर रहा हूं, लेकिन वापसी की गई संख्या स्पष्ट रूप से 13 की निश्चित अधिकतम लंबाई के साथ नहीं है, 32 बिट मामले में अधिकतम लंबाई 10 अंक (int) है, और 64 बिट के लिए है 1 9 (बड़ा)।
तो, 13 अंकों की एक निश्चित अधिकतम लंबाई के साथ एक एन्क्रिप्टेड यादृच्छिक अनुक्रम कैसे प्राप्त करें, जहां न्यूनतम मान 1 है और अधिकतम मान 99 99 99 99 99 999 है?
क्या यह परिणाम प्राप्त करने के लिए 64 बिट pseudo_ecrypt फ़ंक्शन को संशोधित करना संभव है? या यदि संभव नहीं है, तो इस आवश्यकता के साथ एक अद्वितीय अनुक्रम प्राप्त करने के अन्य तरीके हैं?
छद्म एन्क्रिप्ट समारोह (64 बिट)
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 bigint;
l2 bigint;
r1 bigint;
r2 bigint;
i int:=0;
BEGIN
l1:= (VALUE >> 32) & 4294967295::bigint;
r1:= VALUE & 4294967295;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025)/714025.0) * 32767*32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1);
END;
$$ LANGUAGE plpgsql strict immutable;
आप उस फ़ंक्शन से लौटाए गए मान को निश्चित लंबाई के लिए प्रारूपित कर सकते हैं: 'to_char (pseudo_encrypt (nextval ('seq') :: int), '0000000000000') ' –
और अनुक्रम के बारे में क्या? मुझे इसे कैसे सेट करना है? – MattC
आपके द्वारा लिंक किए गए प्रश्न के समान ही। बस सुनिश्चित करें कि आपके पास अधिकतम मान है जो 13 अंकों से अधिक नहीं है। –