মাইএসকিউএল ব্যবহার করে একটি এলোমেলো এবং অনন্য 8 অক্ষরের স্ট্রিং তৈরি করা


110

আমি এমন একটি গেমের সাথে কাজ করছি যা কোনও পর্যায়ে যানবাহন জড়িত। আমার কাছে একটি যানবাহন সম্পর্কিত ডেটা সম্বলিত "যানবাহন" নামক একটি মাইএসকিউএল টেবিল রয়েছে, যার মধ্যে কলাম "প্লেট" রয়েছে যা যানবাহনের জন্য লাইসেন্স প্লেট সংরক্ষণ করে।

এখন এখানে অংশটি নিয়ে আমার সমস্যা হচ্ছে। নতুন গাড়ি তৈরি করার আগে আমার অব্যবহৃত লাইসেন্স প্লেটটি খুঁজে পাওয়া দরকার - এটি একটি বর্ণমালা 8-চরের এলোমেলো স্ট্রিং হওয়া উচিত। আমি কীভাবে এটি অর্জন করেছি লুয়ার একটি লুপটি ব্যবহার করছিলাম, আমি যে ভাষাটিতে প্রোগ্রামিং করছি সেগুলি তৈরি করতে এবং ডিবি ব্যবহার করেছে কিনা তা জানতে ক্যোয়ারী তৈরি করতে। তবে যানবাহনের সংখ্যা বাড়ার সাথে সাথে আমি আশা করি এটি এটি আরও বেশি অদক্ষ হয়ে উঠবে এটি এখনই। অতএব, আমি একটি মাইএসকিউএল কোয়েরি ব্যবহার করে এই সমস্যাটি চেষ্টা করার এবং সমাধান করার সিদ্ধান্ত নিয়েছি।

আমার যে ক্যোয়ারীটির দরকার তা কেবল একটি 8-বর্ণচিহ্নযুক্ত অক্ষর তৈরি করা উচিত যা ইতিমধ্যে টেবিলটিতে নেই। আমি আবার জেনারেট এবং চেক লুপের পদ্ধতির কথা ভেবেছিলাম, তবে আমি যদি আরও দক্ষ একটি ক্ষেত্রে কেবল এই প্রশ্নটিকে সীমাবদ্ধ রাখি না। আমি সমস্ত অনুমোদিত অক্ষরযুক্ত স্ট্রিং সংজ্ঞায়িত করে এবং এলোমেলোভাবে এটির বিস্তৃত করে আরও কিছু না দিয়ে স্ট্রিংগুলি তৈরি করতে সক্ষম হয়েছি।

কোন সাহায্য প্রশংসা করা হয়।


এগুলি হওয়ার জন্য আপনার কতটা এলোমেলো দরকার? কেউ যদি কোনও নির্দিষ্ট লাইসেন্স প্লেট পান তবে এটি গুরুত্বপূর্ণ বা না আপনি পরের বা পূর্ববর্তী লাইসেন্স প্লেটটি সম্পাদন করতে পারেন কিনা?
দামিয়েন_ও_ অবিশ্বাস্য

@ ইয়াক কীভাবে সংঘর্ষের ক্ষুদ্র সম্ভাবনা এড়ানো যায় সে সম্পর্কে আমার উত্তর দেখুন
ইউজেন রিইক

উত্তর:


87

এই সমস্যাটি দুটি খুব ভিন্ন উপ-সমস্যা নিয়ে গঠিত:

  • স্ট্রিং অবশ্যই আপাতদৃষ্টিতে এলোমেলো হতে হবে
  • স্ট্রিংটি অবশ্যই অনন্য হতে হবে

যদিও এলোমেলোতা বেশ সহজেই অর্জন করা যায়, আবার চেষ্টা করে লুপ ছাড়া স্বতন্ত্রতা হয় না। এটি প্রথমে স্বতন্ত্রতার দিকে মনোনিবেশ করতে আমাদের এনে দেয়। নন-এলোমেলো স্বতন্ত্রতা তুচ্ছভাবে অর্জন করা যেতে পারে AUTO_INCREMENT। সুতরাং একটি স্বতন্ত্রতা সংরক্ষণের ব্যবহার করে, সিউডো-এলোমেলো রূপান্তরটি ভাল হবে:

  • হ্যাশকে @ পল পরামর্শ দিয়েছেন
  • এইএস-এনক্রিপ্টও ফিট করে
  • তবে একটি সুন্দর একটি আছে: RAND(N)নিজেই!

একই বীজের দ্বারা তৈরি এলোমেলো সংখ্যার ক্রম হওয়ার নিশ্চয়তা দেওয়া হচ্ছে

  • গঠনকর
  • প্রথম 8 টি পুনরাবৃত্তির জন্য আলাদা
  • বীজ যদি একটি হয় INT32

সুতরাং আমরা @ অ্যান্ড্রেভলকের বা @ গর্ডনলিনফের পদ্ধতিকে ব্যবহার করি তবে বীজযুক্ত সহ RAND :

যেমন আসুমিন idএকটি AUTO_INCREMENTকলাম:

INSERT INTO vehicles VALUES (blah); -- leaving out the number plate
SELECT @lid:=LAST_INSERT_ID();
UPDATE vehicles SET numberplate=concat(
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)
)
WHERE id=@lid;

খুব আন্তঃনদী দৃষ্টিভঙ্গি, তবে আপনি সম্ভবত বোঝাতে চেয়েছিলেন RAND(LAST_INSERT_ID()); UPDATE vehicles (...) , rand()*36+1, (...)(অন্যথায় এটি একই চরিত্রের 8 গুণ ফিরে আসে)। আমরা কীভাবে নিশ্চিত হতে পারি যে 8 টি ধারাবাহিক কলগুলি rand()একটি ভিন্ন বীজ দিয়ে শুরু করা হলে একটি ভিন্ন ক্রম ফেরানোর গ্যারান্টিযুক্ত?
র্যান্ডমসিড

8
আমি শুধু অবাক হচ্ছিলাম. আপনি কেন এই সংখ্যাগুলি ব্যবহার করেন ..4294967296)) * 36 + 1?
মিক

7
এটি কিছুটা পুরানো তবে আমি লক্ষ করতে চাই যে আমাকে FLOOR()দ্বিতীয় স্ট্রিং প্যারামিটারগুলি জুড়তে হয়েছিল: substring('ABC … 789', floor(rand(@seed:= … )*36+1), 1), কিছু অনুষ্ঠানে, স্ট্রিংগুলি 36.9 বর্ণটি বাছাই করার চেষ্টা করছিল, যা 37 এর চেয়ে বড় হয়ে গেলে, কোনও চরিত্রই চয়ন করা যায় না।
ফিলিপ ডডসন

4
স্ট্রিংটি পুনরুত্পাদনযোগ্য হলে আপনি এলোমেলো কল করতে পারবেন না। এবং সদৃশগুলিও সম্ভব, কারণ আপনি ব্যবহার করছেন floor()। এই স্কলফিল্ড দেখায়, ডুপ্লিকেটগুলি তিনটি অক্ষরের দীর্ঘ স্ট্রিংয়ের জন্য তৈরি করা হয়।
পল স্পিগেল

6
@ ইউজেনরেইক আপনি বুঝতে পারছেন না আপনি কীভাবে আপনার নম্বর পাবেন ("প্রথম 2 ^ 32 পুনরাবৃত্তি")। তবে এই ধারণাটি অস্বীকার করার জন্য আমার ডুপ্লিকেটগুলির একটি মাত্র উদাহরণ প্রয়োজন। আইডি 193844এবং 775771আপনার অ্যালগরিদম একই স্ট্রিং T82X711( ডেমো ) উত্পন্ন করবে ।
পল স্পিগেল

113

আমি আমার মন্তব্যে যেমন বলেছি, সংঘর্ষের সম্ভাবনা নিয়ে আমি মাথা ঘামাইনি। কেবল একটি এলোমেলো স্ট্রিং উত্পন্ন করুন এবং এটি বিদ্যমান কিনা তা পরীক্ষা করুন। যদি এটি হয়, আবার চেষ্টা করুন এবং আপনার কাছে ইতিমধ্যে নির্ধারিত বিপুল সংখ্যক প্লেট না থাকলে দু'বার আরও বেশি কিছু করার দরকার নেই।

খাঁটি (মাই) এসকিউএলে একটি 8-বর্ণের দীর্ঘ সিউডো-র্যান্ডম স্ট্রিং উত্পন্ন করার জন্য আরেকটি সমাধান:

SELECT LEFT(UUID(), 8);

আপনি নিম্নলিখিত (সিউডো কোড) চেষ্টা করতে পারেন:

DO 
    SELECT LEFT(UUID(), 8) INTO @plate;
    INSERT INTO plates (@plate);
WHILE there_is_a_unique_constraint_violation
-- @plate is your newly assigned plate number

যেহেতু এই পোস্টটি অপ্রত্যাশিতভাবে মনোযোগ পেয়েছে, তাই আমি এডটিসির মন্তব্যটি তুলে ধরব : উপরের কোডটির টুকরোটি বেশ বোবা এবং ক্রমিক সংখ্যাগুলি তৈরি করে।

কিছুটা কম বোকা এলোমেলোতার পরিবর্তে এরকম কিছু চেষ্টা করুন:

SELECT LEFT(MD5(RAND()), 8)

এবং সত্য (ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত) এলোমেলোতার জন্য, এর RANDOM_BYTES()পরিবর্তে ব্যবহার করুন RAND()(তবে তারপরে আমি এই যুক্তিটিকে অ্যাপ্লিকেশন স্তরের উপরে নিয়ে যাওয়া বিবেচনা করব)।


আপনার সমাধানের জন্য ধন্যবাদ ইউআইডি সংক্রান্ত আমার একটি প্রশ্ন আছে। আপনি 8 টি চরিত্রটি তৈরি করেছেন এমন ID আবার কতবার সম্ভাব্য।
টিআর-আহমেদ

1
@ ব্যবহারকারী 3099183 সরকারীভাবে , "খুব কম"। 16 ^ 8 প্রায় 4 বিলিয়ন সম্ভাব্য স্ট্রিং।
র্যান্ডমসিড

23
অনুগ্রহ করে নোট করুন যে ইউআইডির প্রথম 8 টি অক্ষর এলোমেলো নয়, তবে ক্রমযুক্ত, কারণ এটি টাইমস্ট্যাম্পের ভিত্তিতে।
ADTC

আমি একটি 9-চরিত্রের দীর্ঘ এলোমেলো স্ট্রিং উত্পন্ন করতে চাই এবং আমি যখন 9আপনার কোডটি ব্যবহার করি তখন SELECT LEFT(UUID(), 9);সর্বদা -নবম অক্ষর হিসাবে উত্পন্ন স্ট্রিংয়ের শেষে থাকে। এটা ধ্রুবক। কেন?
মার্টিন এজে

3
@MartinAJ কারণ স্ট্রিং একটি হল UUIDSELECT LEFT(REPLACE(UUID(), '-', ''), 16);
হাইফেনগুলি

53

ক্রমসংখ্যা পূর্ণসংখ্যার MD5 (বা অন্যান্য) হ্যাশ গণনা করার বিষয়ে কী, তারপরে প্রথম 8 টি অক্ষর নেওয়া।

অর্থাত

MD5(1) = c4ca4238a0b923820dcc509a6f75849b => c4ca4238
MD5(2) = c81e728d9d4c2f636f067f89cc14862c => c81e728d
MD5(3) = eccbc87e4b5ce2fe28308fd9f2a7baf3 => eccbc87e

প্রভৃতি

সতর্কতা: সংঘর্ষের আগে আপনি কতজন বরাদ্দ করতে পারেন তা আমার কোনও ধারণা নেই (তবে এটি একটি পরিচিত এবং ধ্রুবক মান হবে)।

সম্পাদনা: এটি এখন একটি পুরানো উত্তর, তবে আমি আবার হাতে হাতে সময়টি দেখেছি, তাই পর্যবেক্ষণ থেকে ...

সমস্ত সংখ্যার সম্ভাবনা = 2.35%

সমস্ত অক্ষরের সম্ভাবনা = 0.05%

MD5 (82945) = "7b763dcb ..." (এমডি 5 (25302) হিসাবে একই ফলাফল) যখন প্রথম সংঘর্ষ


2
ভাল ধারণা, এটি প্রাথমিক কীতে ব্যবহার করতে পারে। ভবিষ্যতের প্রকল্পগুলির জন্য এটি মাথায় রাখবে, ধন্যবাদ!
ফানস্টেইন

2
এমন একটি সম্ভাবনা রয়েছে যা এর ফলাফল কেবলমাত্র সংখ্যার সাথে হতে পারে
ম্লাদেন জানজেটোভিক

9
এটি মোটেও এলোমেলো নয়।
পল

1
অটো ইনক্রিমেন্টাল আইডি ব্যবহার না করে আপনি যে ডেটটাইমটিতে সন্নিবেশটি কাজটি করেছিলেন তা ব্যবহার করুন, এটিও অনন্য।
জাভিয়ের লা বানকা

35

একটি এলোমেলো স্ট্রিং তৈরি করুন

প্রদত্ত দৈর্ঘ্যের এলোমেলো স্ট্রিং তৈরি করতে এখানে একটি মাইএসকিউএল ফাংশন রয়েছে।

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `RandString`(length SMALLINT(3)) RETURNS varchar(100) CHARSET utf8
begin
    SET @returnStr = '';
    SET @allowedChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    SET @i = 0;

    WHILE (@i < length) DO
        SET @returnStr = CONCAT(@returnStr, substring(@allowedChars, FLOOR(RAND() * LENGTH(@allowedChars) + 1), 1));
        SET @i = @i + 1;
    END WHILE;

    RETURN @returnStr;
END

SELECT RANDSTRING(8)8 টি অক্ষরের স্ট্রিং ফেরতের ব্যবহার ।

আপনি কাস্টমাইজ করতে পারেন @allowedChars

স্বতন্ত্রতা গ্যারান্টিযুক্ত নয় - আপনি অন্যান্য সমাধানের মন্তব্যে যেমন দেখবেন, এটি ঠিক সম্ভব নয়। পরিবর্তে আপনাকে একটি স্ট্রিং তৈরি করতে হবে, এটি ইতিমধ্যে ব্যবহারে রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং তা আবার চেষ্টা করুন।


ইতিমধ্যে এলোমেলো স্ট্রিং ব্যবহার হচ্ছে কিনা তা পরীক্ষা করুন

যদি আমরা সংঘর্ষের চেকিং কোডটি অ্যাপের বাইরে রাখতে চাই তবে আমরা একটি ট্রিগার তৈরি করতে পারি:

DELIMITER $$

CREATE TRIGGER Vehicle_beforeInsert
  BEFORE INSERT ON `Vehicle`
  FOR EACH ROW
  BEGIN
    SET @vehicleId = 1;
    WHILE (@vehicleId IS NOT NULL) DO 
      SET NEW.plate = RANDSTRING(8);
      SET @vehicleId = (SELECT id FROM `Vehicle` WHERE `plate` = NEW.plate);
    END WHILE;
  END;$$
DELIMITER ;

6
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, স্পষ্ট এবং মূল বিষয়টি, আমার জন্য ঠিক কাজ করেছে, ধন্যবাদ @ ধান-মান
সাইফ

এটি আমার মনে হয় সেরা সমাধান। ধন্যবাদ মানুষ!
Pronoy999

23

বৈধ অক্ষর হিসাবে আলফা সংখ্যাগুলি ব্যবহার করে এখানে একটি উপায় রয়েছে:

select concat(substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1)
             ) as LicensePlaceNumber;

নোট করুন স্বতন্ত্রতার কোনও গ্যারান্টি নেই। আপনাকে আলাদাভাবে এটি পরীক্ষা করতে হবে।


7
পরিবর্তে মেঝে (র্যান্ড () * 36 + 1) ব্যবহার করুন। অন্যথায় কিছু ফলাফল 'সংক্ষিপ্ত' হবে।
Fraggle

2
35 + 1 টি 36 + 1 নয়! অন্যথায় আপনি 8 টি চর দিয়ে কিছু স্ট্রিং পাবেন এবং
কিছুগুলি

23

এলোমেলো স্ট্রিং উত্পন্ন করার জন্য এখানে আরও একটি পদ্ধতি রয়েছে:

SELECT SUBSTRING(MD5(RAND()) FROM 1 FOR 8) AS myrandomstring


16

আপনি মাইএসকিউএল এর র‌্যান্ড () এবং চর () ফাংশন ব্যবহার করতে পারেন :

select concat( 
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97)
) as name;

14

আপনি এগুলি দিয়ে এলোমেলো বর্ণচিহ্নগুলি তৈরি করতে পারেন:

lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0);

আপনি এটি ট্রিগারটিতে ব্যবহার করতে পারেন BEFORE INSERTএবং কিছুক্ষণের লুপটিতে একটি সদৃশটি পরীক্ষা করতে পারেন :

CREATE TABLE `vehicles` (
    `plate` CHAR(8) NULL DEFAULT NULL,
    `data` VARCHAR(50) NOT NULL,
    UNIQUE INDEX `plate` (`plate`)
);

DELIMITER //
CREATE TRIGGER `vehicles_before_insert` BEFORE INSERT ON `vehicles`
FOR EACH ROW BEGIN

    declare str_len int default 8;
    declare ready int default 0;
    declare rnd_str text;
    while not ready do
        set rnd_str := lpad(conv(floor(rand()*pow(36,str_len)), 10, 36), str_len, 0);
        if not exists (select * from vehicles where plate = rnd_str) then
            set new.plate = rnd_str;
            set ready := 1;
        end if;
    end while;

END//
DELIMITER ;

এখন যেমন আপনার তথ্য সন্নিবেশ করান

insert into vehicles(col1, col2) values ('value1', 'value2');

এবং ট্রিগার plateকলামটির জন্য একটি মান উত্পন্ন করবে ।

( স্ক্যালফিল্ড ডেমো )

কলামটি NULL গুলি মঞ্জুরি দেয় এমনভাবে এটি কাজ করে। আপনি যদি এটি নাল না চান তবে আপনাকে একটি ডিফল্ট মান নির্ধারণ করতে হবে

`plate` CHAR(8) NOT NULL DEFAULT 'default',

বড় হাতের অক্ষরগুলি আপনি যা চান তা যদি না হয় তবে আপনি ট্রিগারটিতে অন্য যে কোনও এলোমেলো স্ট্রিং উত্পন্ন অ্যালগরিদমও ব্যবহার করতে পারেন। তবে ট্রিগার স্বতন্ত্রতার যত্ন নেবে।


অ্যামেজিং! আমি ঠিক তাই চেয়েছিলাম আমি কেবল এটি কীভাবে স্ট্রিংয়ে রূপান্তরিত হয় তা বুঝতে চাই। কেন একটি পাউ আছে, কী করবেন, সংখ্যা যুক্ত করতে হবে ইত্যাদি so যাইহোক, আপনাকে ধন্যবাদ।
অ্যাক্সে

@ অ্যাক্সে কন ( কন ) () কে একটি সংখ্যাটিকে বর্ণানুক্রমিক স্ট্রিংয়ে রূপান্তর করতে ব্যবহার করা যেতে পারে। pow(36,8)-1এর সাংখ্যিক উপস্থাপনা ZZZZZZZZ। সুতরাং আমরা একটি র্যান্ডম পূর্ণসংখ্যা মধ্যে উৎপন্ন 0এবং '36 ^ 8-1 '(থেকে 0থেকে 2821109907455) এবং মধ্যে একটি আলফানিউমেরিক স্ট্রিং রূপান্তর 0এবং ZZZZZZZZunsing conv()ল্যাপড () এর দৈর্ঘ্য 8 না হওয়া অবধি স্ট্রোকটি জিরো দিয়ে পূর্ণ করবে
পল স্পিগেল

আপনি স্যার একটি প্রতিভা। আমি ভাবছি অক্ষরের অবিচ্ছিন্নতার কারণে ছোট অক্ষর যুক্ত করা অসম্ভব? (91-96) এমন নয় যে আমার এটি দরকার, কেবল কৌতূহলী ...
আক্সেক্স

@ অ্যাক্সি conv()কেবলমাত্র 36 (10 অঙ্কের + 26 বড় হাতের অক্ষর) পর্যন্ত বেস সমর্থন করে। আপনি যদি ছোট হাতের অক্ষরগুলি অন্তর্ভুক্ত করতে চান তবে কোনও সংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করার জন্য আপনার অন্য উপায় প্রয়োজন।
পল স্পিগেল

ক্যাভেট: <<< 13 এর জন্য কাজ করে না 14 14 থেকে আপনি সর্বদা '3W5E11264SGSF' পান। ;-)
জেরার্ড এইচ। পিল

6

এলোমেলো স্ট্রিং উত্পন্ন করার জন্য, আপনি ব্যবহার করতে পারেন:

SUBSTRING(MD5(RAND()) FROM 1 FOR 8)

আপনি স্মিথকে এমনভাবে সাজাবেন:

353E50CC


5

৮ টি এলোমেলো সংখ্যা এবং আপার- এবং ছোট হাতের অক্ষর সমন্বিত একটি স্ট্রিংয়ের জন্য, এটি আমার সমাধান:

LPAD(LEFT(REPLACE(REPLACE(REPLACE(TO_BASE64(UNHEX(MD5(RAND()))), "/", ""), "+", ""), "=", ""), 8), 8, 0)

ভিতরে থেকে ব্যাখ্যা করা:

  1. RAND 0 এবং 1 এর মধ্যে একটি এলোমেলো সংখ্যা তৈরি করে
  2. MD5 (1) এর MD5 যোগফল, আফগান এবং 0-9 থেকে 32 টি অক্ষর গণনা করে
  3. UNHEX 00 থেকে এফএফ এর মান সহ 2 টি (2) 16 বাইটে অনুবাদ করে
  4. TO_BASE64 এনকোডগুলি (3) বেস 64 হিসাবে, এজেড এবং এজেড থেকে 22 টি অক্ষর এবং 0-9 প্লাস "/" এবং "+", তারপরে দুটি "="
  5. তিনটি REPLACE"(") থেকে "/", "+" এবং "=" অক্ষর সরিয়ে দেয়
  6. LEFT (5) থেকে প্রথম 8 টি অক্ষর নেয়, যদি আপনার এলোমেলো স্ট্রিংয়ে কম বা কম অক্ষরের প্রয়োজন হয় তবে 8 টির সাথে অন্য কোনও কিছুতে পরিবর্তন করুন
  7. LPAD(6) এর শুরুর দিকে শূন্যগুলি সন্নিবেশ করানো হয় যদি এটি 8 টি অক্ষরের চেয়ে কম দীর্ঘ হয়; আবার প্রয়োজনে 8 কে অন্য কিছুতে পরিবর্তন করুন

দুর্দান্ত, ঠিক কীভাবে আমি মাইএসকিউএলে টোকেনের মতো আইডি তৈরি করতে চেয়েছিলাম
রাবুদে


4

বর্ণমালা থেকে 8 টি বর্ণ - সমস্ত ক্যাপ:

UPDATE `tablename` SET `tablename`.`randomstring`= concat(CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25)))CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))));

3

যদি আপনার আইডি বা বীজ না থাকে তবে এটির মতো একটি মান তালিকার জন্য এটির মতো:

REPLACE(RAND(), '.', '')

2

বড় হাতের অক্ষর এবং ছোট হাতের অক্ষর এবং অঙ্কগুলির সাথে একটি এলোমেলোভাবে 10 টি অক্ষরের স্ট্রিং পাওয়ার সহজ এবং দক্ষ সমাধান:

select substring(base64_encode(md5(rand())) from 1+rand()*4 for 10);

1

যদি আপনি "এলোমেলো" তবে সম্পূর্ণ অনুমানযোগ্য লাইসেন্স প্লেটগুলি দিয়ে ঠিক থাকেন তবে আপনি পরবর্তী প্লেট নম্বর চয়ন করতে একটি রৈখিক-প্রতিক্রিয়া শিফট রেজিস্টার ব্যবহার করতে পারেন - এটি পুনরাবৃত্তি করার আগে প্রতিটি সংখ্যার মধ্য দিয়ে যাওয়ার গ্যারান্টিযুক্ত। তবে কিছু জটিল গণিত ব্যতীত আপনি প্রতি 8 টি অক্ষরের বর্ণানুক্রমিক স্ট্রিং দিয়ে যেতে পারবেন না (আপনি 36 ^ 8 (78%) সম্ভাব্য প্লেটের মধ্যে 2 ^ 41 পাবেন)। এটি আপনার স্থানটি আরও ভাল করে তুলতে, আপনি প্লেটগুলি থেকে একটি চিঠি (সম্ভবত হে) বাদ দিতে পারেন, আপনাকে 97% দিয়েছিলেন।


1

আপনার প্রয়োজনীয় মোট অক্ষরের সংখ্যা বিবেচনায় নিয়ে আপনার দুটি ঠিক একই জাতীয় নম্বর প্লেট তৈরি করার খুব সামান্য সুযোগ হবে। সুতরাং আপনি সম্ভবত LUA সংখ্যা তৈরি করে পালাতে পারেন।

আপনার কাছে 36 ^ 8 টি আলাদা আলাদা অনন্য নম্বরপ্লেট রয়েছে (2,821,109,907,456, এটি অনেকটা), আপনার কাছে ইতিমধ্যে যদি এক মিলিয়ন নাম্বার প্লেট থাকে তবে আপনার কাছে ইতিমধ্যে প্রায় 0.000035% জেনারেট করার খুব কম সম্ভাবনা রয়েছে

অবশ্যই, এটি সমস্ত নির্ভর করে যে আপনি কত নম্বর প্লেটগুলি তৈরি করবেন।


সত্য, আমি এসকিউএল এর পরিবর্তে আসল খেলায় এটি চালিয়ে যাব। আপনাকে অনেক ধন্যবাদ.
ফানস্টেইন

1

এই ফাংশনটি আপনার ইনপুট দৈর্ঘ্যের উপর ভিত্তি করে একটি র্যান্ডম স্ট্রিং উত্পন্ন করে এবং এর মতো অনুমোদিত অক্ষর:

SELECT str_rand(8, '23456789abcdefghijkmnpqrstuvwxyz');

ফাংশন কোড:

DROP FUNCTION IF EXISTS str_rand;

DELIMITER //

CREATE FUNCTION str_rand(
    u_count INT UNSIGNED,
    v_chars TEXT
)
RETURNS TEXT
NOT DETERMINISTIC
NO SQL
SQL SECURITY INVOKER
COMMENT ''
BEGIN
    DECLARE v_retval TEXT DEFAULT '';
    DECLARE u_pos    INT UNSIGNED;
    DECLARE u        INT UNSIGNED;

    SET u = LENGTH(v_chars);
    WHILE u_count > 0
    DO
      SET u_pos = 1 + FLOOR(RAND() * u);
      SET v_retval = CONCAT(v_retval, MID(v_chars, u_pos, 1));
      SET u_count = u_count - 1;
    END WHILE;

    RETURN v_retval;
END;
//
DELIMITER ;

এই কোডটি "রস স্মিথ II" এর মাধ্যমে প্রেরিত শাফল স্ট্রিংয়ের উপর ভিত্তি করে


এই ফাংশনটি এলোমেলো অনন্য মান উত্পন্ন করবে না।
ফয়সাল

1

লুকালিকে চরগুলি 01oOI বাদ দিয়ে একটি এলোমেলোভাবে 10 সংখ্যার অক্ষর তৈরি করতে:

LPAD(LEFT(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TO_BASE64(UNHEX(MD5(RAND()))), "/", ""), "+", ""), "=", ""), "O", ""), "l", ""), "I", ""), "1", ""), "0", ""), "o", ""), 10), 10, 0)

এটি একটি ভাউচার কোড তৈরি করার জন্য ঠিক আমার প্রয়োজন । বিভাজনযুক্ত অক্ষরগুলি কোনও ভাউচার কোড ফর্মটিতে টাইপ করার সময় ত্রুটিগুলি হ্রাস করতে সরানো হয়।

আশা এই জন উহলিগের উজ্জ্বল উত্তরের উপর ভিত্তি করে কাউকে সহায়তা করে ।

এই কোডটি কীভাবে কাজ করে সে সম্পর্কে ব্রেকডাউন করার জন্য দয়া করে জানের উত্তর দেখুন।


0
DELIMITER $$

USE `temp` $$

DROP PROCEDURE IF EXISTS `GenerateUniqueValue`$$

CREATE PROCEDURE `GenerateUniqueValue`(IN tableName VARCHAR(255),IN columnName VARCHAR(255)) 
BEGIN
    DECLARE uniqueValue VARCHAR(8) DEFAULT "";
    WHILE LENGTH(uniqueValue) = 0 DO
        SELECT CONCAT(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1)
                ) INTO @newUniqueValue;
        SET @rcount = -1;
        SET @query=CONCAT('SELECT COUNT(*) INTO @rcount FROM  ',tableName,' WHERE ',columnName,'  like ''',@newUniqueValue,'''');
        PREPARE stmt FROM  @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    IF @rcount = 0 THEN
            SET uniqueValue = @newUniqueValue ;
        END IF ;
    END WHILE ;
    SELECT uniqueValue;
    END$$

DELIMITER ;

এই সঞ্চিত পদ্ধতিটি ব্যবহার করুন এবং এটি প্রতিবারের মতো ব্যবহার করুন

Call GenerateUniqueValue('tableName','columnName')

0

একটি অনন্য সংখ্যা উত্পন্ন করার একটি সহজ উপায়

set @i = 0;
update vehicles set plate = CONCAT(@i:=@i+1, ROUND(RAND() * 1000)) 
order by rand();


0

আমি অনুরূপ কিছু খুঁজছিলাম এবং আমি আমার নিজস্ব সংস্করণ তৈরি করার সিদ্ধান্ত নিয়েছি যেখানে আপনি প্যারামিটার হিসাবে (অক্ষরের তালিকা) চাইলে একটি আলাদা বীজও নির্দিষ্ট করতে পারেন:

CREATE FUNCTION `random_string`(length SMALLINT(3), seed VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
    NO SQL
BEGIN
    SET @output = '';

    IF seed IS NULL OR seed = '' THEN SET seed = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; END IF;

    SET @rnd_multiplier = LENGTH(seed);

    WHILE LENGTH(@output) < length DO
        # Select random character and add to output
        SET @output = CONCAT(@output, SUBSTRING(seed, RAND() * (@rnd_multiplier + 1), 1));
    END WHILE;

    RETURN @output;
END

হিসাবে ব্যবহার করা যেতে পারে:

SELECT random_string(10, '')

যা উচ্চ- এবং ছোট হাতের অক্ষর + ডিজিটের অন্তর্নির্মিত বীজ ব্যবহার করবে। '' এর পরিবর্তে NULL এর মানও হবে।

তবে কেউ কল করার সময় একটি কাস্টম বীজ নির্দিষ্ট করতে পারে:

SELECT random_string(10, '1234')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.