• C/linux 产生随机字符串


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    char* genRandomString(int length)
    {
        int flag, i;
        char* string;
        srand((unsigned) time(NULL ));
        if ((string = (char*) malloc(length)) == NULL )
        {
            //myLog("Malloc failed!flag:14
    ");
            return NULL ;
        }
                     
        for (i = 0; i < length - 1; i++)
        {
            flag = rand() % 3;
            switch (flag)
            {
                case 0:
                    string[i] = 'A' + rand() % 26;
                    break;
                case 1:
                    string[i] = 'a' + rand() % 26;
                    break;
            case 2:
                    string[i] = '0' + rand() % 10;
                    break;
            default:
                    string[i] = 'x';
                    break;
            }
        }
        string[length - 1] = '';
        return string;
    }
    
    int main()
    {
        char *buff;
        buff = genRandomString(50);
        printf("buff=%s
    ",buff);
        free(buff);
        return 0;
    }

    Linux下生成随机数和随机字符串

    1、生成长度为32的随机字符串

    head -c 32 /dev/random | base64
    1
    该方式产生的随机数效果比较好,但是,当不能产生随机数时,它会阻塞在那里,也就是为阻塞程序的执行
    2、用/dev/urandom文件产生

    head -c 32 /dev/random | base64
    1
    该方式产生的随机数随机效果一般是,但是产生速度快,不会阻塞程序的运行
    3、使用openssl方式

    openssl rand -hex 10
    1
    4、生成随机数:

    [root@73 ~]# echo $RANDOM
    32641
    [root@73 ~]# echo $RANDOM
    9753
    [root@73 ~]# echo $RANDOM
    710
    1
    2
    3
    4
    5
    6
    注:得到的这个随机数是介于 0~32767 之间的一个整数。

    5、生成随机字符串

    a、[root@73 ~]# head -n 5 /dev/urandom |sed 's/[^a-Z0-9]//g'|strings -n 4
    fEVN
    Lfkm0
    PMSZfO
    tEIw
    aKbc
    MWLTk1
    1
    2
    3
    4
    5
    6
    7
    注:生成由a-Z和0-9组成的字符串。

    b、[root@73 ~]# openssl passwd -stdin < <(echo)
    5LYYPmuNIFS9c

    c、[root@73 ~]# head -n 5 /dev/urandom |strings -n 5
    ]bE&O
    p#P6C
    _I[K
    C3Hn2,=
    $JfV5q
    {8tD)
    zG}Uw
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    注:
    strings:
    在对象文件或二进制文件中查找可打印的字符串。
    语法:
    语法

    strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [ File ... ]
    1
    参数:

    -a 或 - 搜索整个文件,而不仅仅是数据段,以寻找可打印的字符串。如果省略这个标志,则 strings 命令只在对象文件的初始化数据空间内寻找。
    -n Number 指定最小的字符串长度(除了缺省的 4 个字符以外)。字符串长度的最大值是 4096。这个标志与 -Number 标志相同。
    -o 列出文件中每个跟随在其八进制偏移量之后的字符串。这个标志与 -t o 标志相同。
    -t Format 列出从文件最开始起,每个跟随在其偏移量之后的字符串。该格式取决于用作 Format 变量的字符。
    d
    以十进制写下偏移量。
    o
    以八进制写下偏移量。
    x
    以十六进制写下偏移量。
    注:当 -o 和 -t Format 标志在一个命令行上多次定义,则最后指定的标志控制 strings 命令的行为。
    -Number 指定最小的字符串长度(除了缺省的 4 个字符以外)。字符串长度的最大值是 4096。这个标志与 -n Number 标志相同。
    File 要搜索的二进制文件或对象文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    退出状态
    该命令返回以下退出值:
    0 表示命令成功运行。

    0 表示出错。

    3、从指定字符集合中生成随机字符串:

    #!/bin/bash
    MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+="
    LENGTH="9"
    while [ "${n:=1}" -le "$LENGTH" ]
    do
    PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
    let n+=1
    done
    echo "$PASS"

    exit 0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    4、通过时间获得随机数(date)

    [chengmo@centos5 shell]$date +%s%N
    1287764807051101270
    #这个可以说比较完美了,加入了时间戳,又加上了纳秒
    1
    2
    3
    5、通过系统内部唯一数据生成随机数(/dev/random,urandom)

    [chengmo@centos5 shell]$head -1/dev/urandom
    ãņù…•KTþçanVÕã¹Û&¡õ¾“ô2íùU“ žF¦_ ÿ”†mEðûUráÏ=J¯TŸA•ÌAÚRtÓ
    1
    2
    读一行,怎么是乱码呢?其实它是通过二进制数据保存实时数据的,那么我们怎么样把它变成整型数据呢?


    [chengmo@centos5 ~/shell]$head -200/dev/urandom | cksum
    1615228479 50333
    1
    2
    3
    由于urandom的数据是非常多,不能直接通过cat读取,这里取前200行,其实整个数据都是变化的,取多少也一样是唯一的。

    cksum 将读取文件内容,生成唯一的表示整型数据,只有文件内容不变,生成结果就不会变化,与php crc函数

    6、读取linux 的uuid码

    [chengmo@centos5 ~/shell]$cat /proc/sys/kernel/random/uuid| cksum |cut -f1 -d" "
    2141807556

    转自:https://blog.csdn.net/wy1550365215/article/details/77446501

  • 相关阅读:
    Java Web 笔记(3)
    Java Web笔记(2)
    AndroidSystemDebug官方指导
    Android系统研究资料收集---站在前人的肩膀上
    算法--求出子序列中最大的和
    【CTS】几个serialno失败项
    GMS测试常用命令CTS&GTS&VTS
    cts-verifier测试流程
    通过例子手撕架构模式
    从0系统学Android--3.2四种基本布局
  • 原文地址:https://www.cnblogs.com/Malphite/p/12298342.html
Copyright © 2020-2023  润新知