java যবহ একটি এলোমেলো আলফা-সাংখ্যিক স্ট্রিং কিভাবে তৈরি করবেন?




জাভার ব্যবহার (24)

আমি একটি ছদ্ম-র্যান্ডম আলফা-সংখ্যাসূচক স্ট্রিং তৈরি করতে একটি সহজ জাভা অ্যালগরিদম খুঁজছি। আমার অবস্থানে এটি একটি অনন্য সেশন / কী শনাক্তকারী হিসাবে ব্যবহৃত হবে যা "সম্ভবত" 500K + প্রজন্মের চেয়ে অনন্য হবে (আমার প্রয়োজনগুলি আসলে আরো বেশি পরিশীলিত কিছু করার দরকার নেই)। আদর্শভাবে, আমি আমার স্বতন্ত্রতা প্রয়োজন উপর নির্ভর করে একটি দৈর্ঘ্য নির্দিষ্ট করতে সক্ষম হবে। উদাহরণস্বরূপ, দৈর্ঘ্য 12 একটি জেনারেট স্ট্রিং "AEYGF7K0DM1X" মত কিছু দেখতে পারে।


  1. আপনার প্রয়োজনীয়তা অনুযায়ী স্ট্রিং অক্ষর পরিবর্তন করুন।

  2. স্ট্রিং অপরিবর্তনীয়। এখানে StringBuilder.appendস্ট্রিং concatenation তুলনায় আরো দক্ষ।


public static String getRandomString(int length) {
       final String characters = "[email protected]#$%^&*()_+";
       StringBuilder result = new StringBuilder();
       while(length > 0) {
           Random rand = new Random();
           result.append(characters.charAt(rand.nextInt(characters.length())));
           length--;
       }
       return result.toString();
    }

জাভা 8 এর একটি বিকল্প হল:

static final Random random = new Random(); // Or SecureRandom
static final int startChar = (int) '!';
static final int endChar = (int) '~';

static String randomString(final int maxLength) {
  final int length = random.nextInt(maxLength + 1);
  return random.ints(length, startChar, endChar + 1)
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
}

এখানে এটি একটি স্কাল সমাধান:

(for (i <- 0 until rnd.nextInt(64)) yield { 
  ('0' + rnd.nextInt(64)).asInstanceOf[Char] 
}) mkString("")

UUID ব্যবহার করা অনিরাপদ, কারণ UUID অংশগুলি এলোমেলোভাবে এলোমেলো হয় না। @ ইিকসন পদ্ধতিটি খুব সুষ্ঠু, কিন্তু একই দৈর্ঘ্যের স্ট্রিং তৈরি করে না। নিম্নলিখিত স্নিপেট যথেষ্ট হওয়া উচিত:

/*
 * The random generator used by this class to create random keys.
 * In a holder class to defer initialization until needed.
 */
private static class RandomHolder {
    static final Random random = new SecureRandom();
    public static String randomKey(int length) {
        return String.format("%"+length+"s", new BigInteger(length*5/*base 32,2^5*/, random)
            .toString(32)).replace('\u0020', '0');
    }
}

কেন length*5 নির্বাচন। এর দৈর্ঘ্য 1 এর র্যান্ডম স্ট্রিংয়ের সাধারণ কেসটি ধরুন, তাই একটি র্যান্ডম চরিত্র। 0-9 এবং অক্ষর অক্ষর ধারণকারী একটি র্যান্ডম চরিত্র পেতে, প্রতিটি বর্ণের একটি পেতে আমাদের 0 এবং 35 এর মধ্যে একটি র্যান্ডম সংখ্যা প্রয়োজন। BigInteger একটি র্যান্ডম সংখ্যা উৎপন্ন করতে একটি কনস্ট্রাক্টর সরবরাহ করে, পরিসীমা 0 to (2^numBits - 1) সমানভাবে বিতরণ করে। দুর্ভাগ্যবশত 35 নম্বর কোন সংখ্যা নেই যা 2 ^ numbits দ্বারা পাওয়া যেতে পারে - 1. সুতরাং আমাদের দুটি বিকল্প রয়েছে: হয় 2^5-1=31 বা 2^6-1=63 । যদি আমরা 2^6 বেছে নেব তবে আমরা অনেকগুলি "unnecesarry" / "longer" সংখ্যাগুলি পেতে পারি। অতএব 2^5 ভাল বিকল্প, এমনকি যদি আমরা 4 অক্ষর (wz) আলাদা করি। এখন একটি নির্দিষ্ট দৈর্ঘ্যের একটি স্ট্রিং তৈরি করতে, আমরা কেবল একটি 2^(length*numBits)-1 নম্বর ব্যবহার করতে পারেন। শেষ সমস্যা, যদি আমরা একটি নির্দিষ্ট দৈর্ঘ্যের সাথে একটি স্ট্রিং চাই, র্যান্ডমটি একটি ছোট সংখ্যা তৈরি করতে পারে, তাই দৈর্ঘ্য পূরণ করা হয় না, তাই আমাদের জিরোগুলিকে প্রারম্ভিক দৈর্ঘ্যের সাথে স্ট্রিংটি প্যাড করতে হবে।


অ্যালগরিদম

একটি র্যান্ডম স্ট্রিং তৈরি করার জন্য, স্ট্রিংটি পছন্দসই লম্বায় পৌঁছে পর্যন্ত গ্রহণযোগ্য প্রতীকগুলির সেট থেকে এলোমেলোভাবে টানা অক্ষরগুলিকে টানা।

বাস্তবায়ন

এখানে র্যান্ডম শনাক্তকারী তৈরির জন্য কিছুটা সহজ এবং খুব নমনীয় কোড রয়েছে। গুরুত্বপূর্ণ অ্যাপ্লিকেশন নোট জন্য অনুসরণ করে যে তথ্য পড়ুন

import java.security.SecureRandom;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;

public class RandomString {

    /**
     * Generate a random string.
     */
    public String nextString() {
        for (int idx = 0; idx < buf.length; ++idx)
            buf[idx] = symbols[random.nextInt(symbols.length)];
        return new String(buf);
    }

    public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public static final String lower = upper.toLowerCase(Locale.ROOT);

    public static final String digits = "0123456789";

    public static final String alphanum = upper + lower + digits;

    private final Random random;

    private final char[] symbols;

    private final char[] buf;

    public RandomString(int length, Random random, String symbols) {
        if (length < 1) throw new IllegalArgumentException();
        if (symbols.length() < 2) throw new IllegalArgumentException();
        this.random = Objects.requireNonNull(random);
        this.symbols = symbols.toCharArray();
        this.buf = new char[length];
    }

    /**
     * Create an alphanumeric string generator.
     */
    public RandomString(int length, Random random) {
        this(length, random, alphanum);
    }

    /**
     * Create an alphanumeric strings from a secure generator.
     */
    public RandomString(int length) {
        this(length, new SecureRandom());
    }

    /**
     * Create session identifiers.
     */
    public RandomString() {
        this(21);
    }

}

ব্যবহার উদাহরণ

8 অক্ষর সনাক্তকারীর জন্য একটি অনিরাপদ জেনারেটর তৈরি করুন:

RandomString gen = new RandomString(8, ThreadLocalRandom.current());

সেশন সনাক্তকারীর জন্য একটি সুরক্ষিত জেনারেটর তৈরি করুন:

RandomString session = new RandomString();

প্রিন্টিংয়ের জন্য সহজ-পড়তে কোড সহ একটি জেনারেটর তৈরি করুন। নিম্ন চিহ্নগুলি ব্যবহার করার জন্য ক্ষতিপূরণ করার জন্য স্ট্রিং পূর্ণ আলফানিউমেরিক স্ট্রিংগুলির চেয়ে বেশি:

String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx";
RandomString tickets = new RandomString(23, new SecureRandom(), easy);

সেশন সনাক্তকারী হিসাবে ব্যবহার করুন

অনন্য হতে পারে এমন সেশন সনাক্তকারীগুলি জেনারেট করা যথেষ্ট ভাল নয়, অথবা আপনি কেবল একটি সহজ পাল্টা ব্যবহার করতে পারেন। পূর্বাভাস সনাক্তকারী ব্যবহার করা হয় যখন আক্রমণকারীদের হাইজ্যাক সেশন।

দৈর্ঘ্য এবং নিরাপত্তা মধ্যে উত্তেজনা আছে। ছোট সম্ভাবনার অনুমান করা সহজ কারণ কম সম্ভাবনা আছে। কিন্তু দীর্ঘ সনাক্তকারীরা আরও স্টোরেজ এবং ব্যান্ডউইথ ব্যবহার করে। প্রতীকগুলির একটি বড় সেট সাহায্য করে কিন্তু এটি যদি এনকোডাইফায়ারগুলিকে URL গুলিতে অন্তর্ভুক্ত করা হয় বা হাত দ্বারা পুনরায় প্রবেশ করা হয় তবে এনকোডিং সমস্যার কারণ হতে পারে।

সেশন সনাক্তকারীর জন্য এলোমেলোতা, বা এনট্রপি অন্তর্নিহিত উৎস, ক্রিপ্টোগ্রাফির জন্য পরিকল্পিত একটি র্যান্ডম সংখ্যা জেনারেটর থেকে আসা উচিত। যাইহোক, এই জেনারেটরের সূচনা কখনও কখনও তুলনামূলকভাবে ব্যয়বহুল বা ধীর হতে পারে, তাই সম্ভব হলে তাদের পুনরায় ব্যবহার করার জন্য প্রচেষ্টা করা উচিত।

বস্তু সনাক্তকারী হিসাবে ব্যবহার করুন

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

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

সনাক্তকারীদের প্রত্যাশিত মোট সংখ্যা প্রদত্ত সম্ভাবনাগুলি সংঘটিত হওয়ার পক্ষে যথেষ্ট দীর্ঘায়িত সনাক্তকারীগুলিকে ব্যবহার করার জন্যও যত্ন নেওয়া উচিত। এই "জন্মদিন প্যারাডক্স" হিসাবে উল্লেখ করা হয়। সংঘর্ষের সম্ভাব্যতা, পি , প্রায় ২ 2 / ( 2 x x ), যেখানে n প্রকৃতপক্ষে উৎপন্ন সনাক্তকারী সংখ্যা, q বর্ণমালাতে স্বতন্ত্র প্রতীকগুলির সংখ্যা এবং x সনাক্তকারীর দৈর্ঘ্য। এটি একটি খুব ছোট সংখ্যা, 2 -50 বা তার কম হওয়া উচিত।

এই কাজটি দেখায় যে 500k 15-অক্ষর সনাক্তকারীগুলির মধ্যে সংঘর্ষের সম্ভাবনা প্রায় ২ -52 , যা সম্ভবত কসমেমিক রেগুলি থেকে সনাক্ত হওয়া ত্রুটিগুলির চেয়ে কম সম্ভাবনা।

UUID সঙ্গে তুলনা

তাদের স্পেসিফিকেশন অনুসারে, UUIDগুলি অনির্দেশ্য হওয়ার জন্য ডিজাইন করা হয় না এবং এটি সেশন সনাক্তকারী হিসাবে ব্যবহার করা উচিত নয়

UUID তাদের আদর্শ বিন্যাসে প্রচুর পরিমাণে জায়গা নেয়: 36 অক্ষর এনট্রোপির 1২২ বিটের জন্য। (একটি "র্যান্ডম" UUID সমস্ত বিট এলোমেলোভাবে নির্বাচিত হয় না।) একটি এলোমেলোভাবে নির্বাচিত আলফানিউমেরিক স্ট্রিং মাত্র 21 অক্ষরের মধ্যে আরো এনট্রপি প্যাক।

UUID নমনীয় নয়; তারা একটি মানসম্মত গঠন এবং বিন্যাস আছে। এই তাদের প্রধান সদগুণ পাশাপাশি তাদের প্রধান দুর্বলতা। বাহিরের পক্ষের সাথে সহযোগিতা করার সময়, UUID দ্বারা প্রস্তাবিত মানদণ্ড সহায়ক হতে পারে। সম্পূর্ণরূপে অভ্যন্তরীণ ব্যবহারের জন্য, তারা অকার্যকর হতে পারে।


আপনি 64 বিট র্যান্ডম তথ্য পেতে তার GetLeastSignificantBits () বার্তাটি দিয়ে UUID শ্রেণীটি ব্যবহার করতে পারেন, তারপরে এটি একটি রেডিক্স 36 নম্বর (অর্থাত্ 0 -9, AZ সহ একটি স্ট্রিং) রূপান্তর করুন:

Long.toString(Math.abs( UUID.randomUUID().getLeastSignificantBits(), 36));

এটি 13 অক্ষরের দীর্ঘ পর্যন্ত একটি স্ট্রিং উত্পন্ন করে। আমরা math.abs () ব্যবহার করে নিশ্চিত করতে একটি ক্ষুদ্র চিহ্ন সাইন ইন নেই।


যদি আপনার পাসওয়ার্ড বাধ্যতামূলক নম্বর সংখ্যা বর্ণমালা বিশেষ অক্ষর থাকে তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

private static final String NUMBERS = "0123456789";
private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIALCHARACTERS = "@#$%&*";
private static final int MINLENGTHOFPASSWORD = 8;

public static String getRandomPassword() {
    StringBuilder password = new StringBuilder();
    int j = 0;
    for (int i = 0; i < MINLENGTHOFPASSWORD; i++) {
        password.append(getRandomPasswordCharacters(j));
        j++;
        if (j == 3) {
            j = 0;
        }
    }
    return password.toString();
}

private static String getRandomPasswordCharacters(int pos) {
    Random randomNum = new Random();
    StringBuilder randomChar = new StringBuilder();
    switch (pos) {
        case 0:
            randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1)));
            break;
        case 1:
            randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1)));
            break;
        case 2:
            randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1)));
            break;
        case 3:
            randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1)));
            break;
    }
    return randomChar.toString();

}



এখানে AbacusUtil দ্বারা একটি লাইন কোডAbacusUtil

String.valueOf(CharStream.random('0', 'z').filter(c -> N.isLetterOrDigit(c)).limit(12).toArray())

র্যান্ডম মানে এটি অনন্য হতে হবে না। ব্যবহার করে অনন্য স্ট্রিং পেতে:

N.uuid() // e.g.: "e812e749-cf4c-4959-8ee1-57829a69a80f". length is 36.
N.guid() // e.g.: "0678ce04e18945559ba82ddeccaabfcd". length is 32 without '-'

জাভা সরাসরি এই কাজ করার একটি উপায় সরবরাহ করে। আপনি যদি ড্যাশগুলি না চান তবে সেগুলিকে সরানো সহজ। শুধু uuid.replace("-", "") ব্যবহার uuid.replace("-", "")

import java.util.UUID;

public class randomStringGenerator {
    public static void main(String[] args) {
        System.out.println(generateString());
    }

    public static String generateString() {
        String uuid = UUID.randomUUID().toString();
        return "uuid = " + uuid;
    }
}

আউটপুট:

uuid = 2d7428a6-b58c-4008-8575-f05549f16316

আপনি এই জন্য Apache লাইব্রেরি ব্যবহার করতে পারেন: RandomStringUtils

RandomStringUtils.randomAlphanumeric(20).toUpperCase();

"সহজ" সমাধান সম্পর্কিত এই উত্তরগুলির মধ্যে কোনটি সত্যিই পছন্দ করবেন না: এস

আমি একটি সহজ জন্য যেতে হবে;), বিশুদ্ধ জাভা, এক মাছ ধরার নৌকা (এনট্রপি র্যান্ডম স্ট্রিং দৈর্ঘ্য এবং প্রদত্ত অক্ষর সেট উপর ভিত্তি করে):

public String randomString(int length, String characterSet) {
    return IntStream.range(0, length).map(i -> new SecureRandom().nextInt(characterSet.length())).mapToObj(randomInt -> characterSet.substring(randomInt, randomInt + 1)).collect(Collectors.joining());
}

@Test
public void buildFiveRandomStrings() {
    for (int q = 0; q < 5; q++) {
        System.out.println(randomString(10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));//charachterSet can basically be anything
    }
}

অথবা (একটু বেশি পঠনযোগ্য পুরানো উপায়)

public String randomString(int length, String characterSet) {
    StringBuilder sb = new StringBuilder(); //consider using StringBuffer if needed
    for (int i = 0; i < length; i++) {
        int randomInt = new SecureRandom().nextInt(characterSet.length());
        sb.append(characterSet.substring(randomInt, randomInt + 1));
    }
    return sb.toString();
}

@Test
public void buildFiveRandomStrings() {
    for (int q = 0; q < 5; q++) {
        System.out.println(randomString(10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")); //charachterSet can basically be anything
    }
}

কিন্তু অন্যদিকে আপনি ইউআইআইডি-র সাথেও যেতে পারেন যার বেশ ভাল এনট্রপি রয়েছে ( 2 ):

UUID.randomUUID().toString().replace("-", "")

আশা করি এইটি কাজ করবে.


public static String randomSeriesForThreeCharacter() {
    Random r = new Random();
    String value="";
    char random_Char ;
    for(int i=0; i<10;i++)
    { 
        random_Char = (char) (48 + r.nextInt(74));
        value=value+random_char;
    }
    return value;
}

import java.util.Date;
import java.util.Random;

public class RandomGenerator {

  private static Random random = new Random((new Date()).getTime());

    public static String generateRandomString(int length) {
      char[] values = {'a','b','c','d','e','f','g','h','i','j',
               'k','l','m','n','o','p','q','r','s','t',
               'u','v','w','x','y','z','0','1','2','3',
               '4','5','6','7','8','9'};

      String out = "";

      for (int i=0;i<length;i++) {
          int idx=random.nextInt(values.length);
          out += values[idx];
      }
      return out;
    }
}

public static String generateSessionKey(int length){
String alphabet = 
        new String("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); //9
int n = alphabet.length(); //10

String result = new String(); 
Random r = new Random(); //11

for (int i=0; i<length; i++) //12
    result = result + alphabet.charAt(r.nextInt(n)); //13

return result;
}

হয়তো এই সহায়ক

package password.generater;

import java.util.Random;

/**
 *
 * @author dell
 */
public class PasswordGenerater {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int length= 11;
        System.out.println(generatePswd(length));

        // TODO code application logic here
    }
    static char[] generatePswd(int len){
        System.out.println("Your Password ");
        String charsCaps="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
        String Chars="abcdefghijklmnopqrstuvwxyz";
        String nums="0123456789";
        String symbols="[email protected]#$%^&*()_+-=.,/';:?><~*/-+";
        String passSymbols=charsCaps + Chars + nums +symbols;
        Random rnd=new Random();
        char[] password=new char[len];

        for(int i=0; i<len;i++){
            password[i]=passSymbols.charAt(rnd.nextInt(passSymbols.length()));
        }
      return password;

    }
}

এটি কোনো বহিরাগত লাইব্রেরি ছাড়া সহজে অর্জনযোগ্য।

1. ক্র্রিপ্টোগ্রাফিক ছদ্ম র্যান্ডম ডেটা জেনারেশন

প্রথম আপনি একটি ক্রিপ্টোগ্রাফিক PRNG প্রয়োজন। জাভাতে SecureRandom রয়েছে যা সাধারণত যন্ত্রের সেরা এনট্রপি উত্স ব্যবহার করে (যেমন /dev/random )। এখানে আরো পড়ুন।

SecureRandom rnd = new SecureRandom();
byte[] token = new byte[byteLength];
rnd.nextBytes(token);

দ্রষ্টব্য: SecureRandom হল ধীরতম, কিন্তু জাভাতে র্যান্ডম বাইট তৈরির সবচেয়ে নিরাপদ উপায়। আমি আপনাকে প্রতি সেকেন্ডে লক্ষ লক্ষ টোকেন উৎপন্ন না করা পর্যন্ত এটি সাধারণত আপনার অ্যাপ্লিকেশন উপর কোন বাস্তব প্রভাব আছে, কারণ এখানে কর্মক্ষমতা বিবেচনা না সুপারিশ।

2. সম্ভাব্য মান প্রয়োজনীয় স্থান

পরবর্তী আপনি আপনার টোকেন হতে হবে "কিভাবে অনন্য" সিদ্ধান্ত নিতে হবে। এনট্রপি বিবেচনা করার সম্পূর্ণ ও একমাত্র বিন্দু নিশ্চিত করে যে সিস্টেমটি বর্বর বাহিনীর আক্রমণ প্রতিরোধ করতে পারে: সম্ভাব্য মূল্যের স্থান এত বড় হওয়া দরকার যে কোনও আক্রমণকারী অযৌক্তিক সময়ে 1 মানগুলির একটি অনুপযুক্ত অনুপাতের চেষ্টা করতে পারে। র্যান্ডম UUID র মতো অনন্য সনাক্তকারীর 122 বিট এনট্রপি (অর্থাৎ ২ ^ 1২2 = 5.3x10 ^ 36) - সংঘর্ষের সম্ভাবনা "* (...) হতে পারে যেখানে দ্বৈততার এক বিলিয়ন সম্ভাবনা রয়েছে, 103 ট্রিলিয়ন সংস্করণ 4 UUIDs 2 উত্পন্ন করা আবশ্যক "। আমরা 128 বিট বেছে নেব কারণ এটি ঠিক 16 বাইটের মধ্যেই ফিট করে এবং মূলত প্রত্যেকের জন্য অনন্য হওয়ার জন্য অত্যন্ত পর্যাপ্ত হিসাবে দেখা হয় তবে সর্বাধিক চরম, ক্ষেত্রে ব্যবহার করুন এবং আপনাকে সদৃশ সম্পর্কে চিন্তা করতে হবে না। এখানে জন্মদিনের সমস্যার সহজ বিশ্লেষণ সহ এনট্রপি এর একটি সহজ তুলনা টেবিল।

সাধারণ প্রয়োজনীয়তাগুলির জন্য 8 বা 1২ বাইট দৈর্ঘ্য যথেষ্ট হতে পারে, তবে 16 বাইটের সাথে আপনি "নিরাপদ পাশে" রয়েছেন।

এবং যে মূলত এটা। শেষ জিনিসটি এনকোডিং সম্পর্কে চিন্তা করা যাতে এটি একটি মুদ্রণযোগ্য পাঠ্য (পঠন, একটি String ) হিসাবে উপস্থাপিত হতে পারে।

3. টেক্সট এনকোডিং বাইনারি

বৈশিষ্টসূচক এনকোডিং অন্তর্ভুক্ত:

  • Base64 প্রতিটি অক্ষর 6bit একটি 33% ওভারহেড তৈরি encodes। দুর্ভাগ্যবশত জেডিকে ( 7 এবং তারপরে - Android এবং জাভা 8+ এ আছে ) কোনও আদর্শ বাস্তবায়ন নেই । কিন্তু অনেক লাইব্রেরি বিদ্যমান এই বিদ্যমান । নিম্নগামী হয়, যে স্ট্যান্ডার্ড Base64 যেমন জন্য নিরাপদ নয়। ইউআরএল এবং অতিরিক্ত ফাইল সিস্টেমে ফাইল নাম হিসাবে অতিরিক্ত এনকোডিং প্রয়োজন (যেমন ইউআরএল এনকোডিং ) বা বেস 64 এর URL নিরাপদ সংস্করণ ব্যবহার করা হয় । প্যাডিং সহ 16 বাইট উদাহরণ এনকোডিং: XfJhfv3C0P6ag7y9VQxSbw==

  • বেস 32 প্রতিটি অক্ষর 5bit একটি 40% overhead তৈরি encodes। কেস-ইনসেন্সটিভ আলফা-সংখ্যাসূচক থাকার সময় এটি AZ এবং 2-7 ব্যবহার করে এটি কার্যকরভাবে কার্যকর কার্যকর করবে। জেডিকে কোন আদর্শ বাস্তবায়ন নেই। প্যাডিং ছাড়াই 16 বাইট এনকোডিং উদাহরণ: WUPIL5DQTZGMF4D3NX5L7LNFOY

  • Base16 (হেক্স) প্রতিটি চরিত্র এনকোড 4bit প্রতি বাইট 2 অক্ষর প্রয়োজন (অর্থাৎ 16 বাইট দৈর্ঘ্য 32 একটি স্ট্রিং তৈরি)। সুতরাং Base32 চেয়ে কম স্পেস দক্ষ কিন্তু অধিকাংশ ক্ষেত্রে (url) ব্যবহার করা নিরাপদ, কারণ এটি শুধুমাত্র 0-9 এবং A থেকে F । উদাহরণ এনকোডিং 16 বাইট: 4fa3dd0f57cb3bf331441ed285b27735এখানে হেক্স রূপান্তর সম্পর্কে একটি SO আলোচনা দেখুন।

Base85 এবং বহিরাগত Base122 Base85 মতো অতিরিক্ত এনকোডিংগুলি ভাল / খারাপ স্থান দক্ষতার সাথে বিদ্যমান। আপনি নিজের এনকোডিং তৈরি করতে পারেন (যা মূলত এই থ্রেডে বেশিরভাগ উত্তর দেয়) তবে যদি আপনার খুব নির্দিষ্ট প্রয়োজনীয়তা না থাকে তবে আমি এটির বিরুদ্ধে পরামর্শ দেব। উইকিপিডিয়া নিবন্ধে আরও এনকোডিং স্কিম দেখুন

4. সারসংক্ষেপ এবং উদাহরণ

  • SecureRandom ব্যবহার করুন
  • সম্ভাব্য মান অন্তত 16 বাইট (2 ^ 128) ব্যবহার করুন
  • আপনার প্রয়োজনীয়তা অনুযায়ী এনকোড (সাধারণত hex বা base32 যদি আপনি এটি alpha-numeric হতে প্রয়োজন)

না

  • ... আপনার হোম ব্রু এনকোডিং ব্যবহার করুন: অন্যের জন্য ভাল রক্ষণযোগ্য এবং পঠনযোগ্য যদি তারা দেখতে পায় যে কোনও স্ট্যান্ডার্ড এনকোডিং আপনি কোন সময়ে অক্ষর তৈরির জন্য অদ্ভুত পরিবর্তে ব্যবহার করেন।
  • ... UUID ব্যবহার করুন: আপনি 6 বিট এনট্রপি নষ্ট করছেন এবং শব্দের স্ট্রিং উপস্থাপনা আছে

উদাহরণ: হেক্স টোকেন জেনারেটর

public static String generateRandomHexToken(int byteLength) {
    SecureRandom secureRandom = new SecureRandom();
    byte[] token = new byte[byteLength];
    secureRandom.nextBytes(token);
    return new BigInteger(1, token).toString(16); //hex encoding
}

//generateRandomHexToken(16) -> 2189df7475e96aa3982dbeab266497cd

উদাহরণ: টুল

আপনি যদি প্রস্তুত-ব্যবহারযোগ্য ক্লি সরঞ্জাম চান তবে আপনি ডাইস ব্যবহার করতে পারেন: https://github.com/patrickfav/dice


public static String getRandomString(int length) {
        char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST".toCharArray();

        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[random.nextInt(chars.length)];
            sb.append(c);
        }
        String randomStr = sb.toString();

        return randomStr;
    }

static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static SecureRandom rnd = new SecureRandom();

String randomString( int len ){
   StringBuilder sb = new StringBuilder( len );
   for( int i = 0; i < len; i++ ) 
      sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
   return sb.toString();
}

এখানে এটি জাভা মধ্যে:

import static java.lang.Math.round;
import static java.lang.Math.random;
import static java.lang.Math.pow;
import static java.lang.Math.abs;
import static java.lang.Math.min;
import static org.apache.commons.lang.StringUtils.leftPad

public class RandomAlphaNum {
  public static String gen(int length) {
    StringBuffer sb = new StringBuffer();
    for (int i = length; i > 0; i -= 12) {
      int n = min(12, abs(i));
      sb.append(leftPad(Long.toString(round(random() * pow(36, n)), 36), n, '0'));
    }
    return sb.toString();
  }
}

এখানে একটি নমুনা রান:

scala> RandomAlphaNum.gen(42)
res3: java.lang.String = uja6snx21bswf9t89s00bxssu8g6qlu16ffzqaxxoy

এখানে কেউ সুপারিশ করছেন না তবে:

import java.util.UUID

UUID.randomUUID().toString();

সহজ।

এই সুবিধা UUIDs দীর্ঘ এবং দীর্ঘ এবং সংঘর্ষ প্রায় অসম্ভব হতে নিশ্চিত।

উইকিপিডিয়া এর একটি ভাল ব্যাখ্যা আছে:

"... পরবর্তী 100 বছরে প্রতি সেকেন্ডে 1 বিলিয়ন ইউयूআইডি উৎপন্ন করার পরে, শুধুমাত্র একটি নকল তৈরির সম্ভাবনা প্রায় 50% হবে।"

http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

প্রথম 4 বিট সংস্করণের জন্য সংস্করণ টাইপ এবং 2 হয় যাতে আপনি 1২2 বিট র্যান্ডম পান। তাই যদি আপনি চান যে আপনি UUID এর আকার হ্রাস করতে শেষ থেকে ছিন্ন করতে চান । এটি সুপারিশ করা হয় না তবে আপনার এখনও 500K রেকর্ডগুলি সহজতর জন্য অনাক্রম্যতা লোড আছে।


আপনি যদি Apache ক্লাসগুলি ব্যবহারে খুশি হন তবে আপনি org.apache.commons.text.RandomStringGenerator (commons-text) ব্যবহার করতে পারেন।

উদাহরণ:

RandomStringGenerator randomStringGenerator =
        new RandomStringGenerator.Builder()
                .withinRange('0', 'z')
                .filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS)
                .build();
randomStringGenerator.generate(12); // toUpperCase() if you want

কমন্স-ল্যাং 3.6 থেকে, RandomStringUtils


public static String getRandomString(int length) 
{
   String randomStr = UUID.randomUUID().toString();
   while(randomStr.length() < length) {
       randomStr += UUID.randomUUID().toString();
   }
   return randomStr.substring(0, length);
}




alphanumeric