添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
叛逆的沙滩裤  ·  炙甘草_百度百科·  1 月前    · 
憨厚的佛珠  ·  假如给你一个机会, ...·  3 月前    · 
被表白的楼梯  ·  石燕飞_百度百科·  1 年前    · 
英勇无比的日记本  ·  IEEE fellow ...·  1 年前    · 

Linux平台利用dev/urandom来生成随机数,再转成字符串。

dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。

以下代码生成的字符串长度为两倍len.

#include"log_uuid.h"
#include <stdlib.h>
#include <unistd.h>
#include<fcntl.h>
std::string getUUID(unsigned int len) {
    std::string str;
    unsigned char* buffer = new unsigned char[len+1];
    char* uuid = new char [2*len+1];
    int fd = open("/dev/urandom", O_RDONLY);
    if (read(fd, buffer, len) == len) {
        for(int i=0;i<len;i++)
            sprintf(uuid+i*2, "%02X",buffer[i]);
        uuid[2*len] = '\0';
        str = uuid;
    } else {
        printf("Error: GetUnique %d\n", __LINE__);
    delete [] buffer;
    delete [] uuid;
    return str;

使用/dev/urandom生成uuid这种方法的一个应用案例就是在Redis 分布式锁redlock算法.redlock算法中,客户端加锁前需要生成一个uuid作为签名。

I assume it’s 20 bytes from /dev/urandom, but you can find cheaper ways to make it unique enough for your tasks.

Redis官方建议通过/dev/urandom生成20字节的uuid,但是也可以使用其它一些代价更低的算法来实现,只要能够满足需求就行。以下是Redis官方推荐的redlock C++实现,此处代码做了一些细小的改动。

sds CRedLock::GetUniqueLockId() {
    unsigned char buffer[20];
    // open rand file
    m_fd = open("/dev/urandom", O_RDONLY);
    if (read(m_fd, buffer, sizeof(buffer)) == sizeof(buffer)) {
        //获取20byte的随机数据
        sds s;
        s = sdsempty();
        for (int i = 0; i < 20; i++) {
            s = sdscatprintf(s, "%02X", buffer[i]);
        return s;
    } else {
        //读取失败
        printf("Error: GetUniqueLockId %d\n", __LINE__);
    return NULL;

在项目中可能需要生成一些随机字符串来作为测试用例,可以用另一种方法来生成实现,这种方法更加快捷,虽然随机性差一些但是已经够用了。

另一方法,生成最大长度为maxlen的随机长度的随机字符串

std::string randstr(int max_len)
    int real_len = rand() % max_len;
    if(real_len == 0) return "";
    char* str = (char*)malloc(real_len);
    for (int i = 0; i < real_len; ++i)
        switch ((rand() % 3))
        case 1:
            str[i] = 'A' + rand() % 26;
            break;
        case 2:
            str[i] = 'a' + rand() % 26;
            break;
        default:
            str[i] = '0' + rand() % 10;
            break;
    str[real_len -1] = '\0';
    std::string string = str;
    free(str);
    return string;
                    Linux平台利用dev/urandom来生成随机数,再转成字符串,以下代码生成的字符串长度为两倍len.dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。#include"log_uuid.h"#include &lt;stdlib.h&gt;#include &lt;unistd.h&gt;#include&lt
static std::string GetUUID() {
    static std::random_device rd;
    static std::uniform_int_distribution<uint64_t> dist(0, 0xFFFFFFFFFFFFFFFFULL);
    uint64_t ab = dist(rd);
    uint64_t cd = dist(.
				
最近项目的需要,使用了C++来生成uuid。这里找到了githup上面的sole.hpp。具体使用方法。可以参考网站。 https://github.com/r-lyeh-archived/sole 那么下面,我们来看一下以v0的方式生成uuid。 sole::uuid u0 = sole::uuid0(); string stru0 = u0.str(); 因为是在其他方面的...
今天发现一个以前写的生成指定长度的随机字符串的函数,在连续调用时会返回相同的字符串,发现是以time(NULL)作为随机种子,于是做了下改进。 将种子改为当前秒数和微秒的和,这样就可以保证连续请求(us等级)多次不会导致生成相同的字符序列。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> int get_random_str(char
C++ 生成随机字符串 这个需求也是最近一个项目里的实际需求。测试一个数据库相关的代码。要往数据库里随机的填写一些字段。 从原理上是很容易实现。建立一个数组,存放一些字符。然后随机的从里面取一些字符凑成一个字符串。 所以这个代码没啥可说的。里面用到了 std::random_device,std::mt19937 ,std::uniform_int_distribution 可以作为 C++ 生成随机数的一个例子。还用到了初始化列表来初始化一个 QVector , 这个也可以作为一个例子。
UUID(Universally Unique Identifier)是一种用来标识数据的标准,它通常用来生成唯一的序列号或者标识符。 C 语言中可以使用库函数 uuid_generate 来生成 UUID。需要注意的是,该函数需要使用到 libuuid 库,所以需要在编译时链接该库。 下面是一个示例代码,用来生成 UUID: #include <stdio.h> #include &...
最近给自己的网站搞一个相册,随机生成图片名字,生成100W个16位的名字,测试没重复,感觉还不错,生成的数字是均匀分布的cppreference #include <random> #include <iostream> #include <unistd.h> #include <unordered_set> using namespace std; char seed[64] = { '0','1','2','3','4','5','6','7','
在Java中,可以使用UUID类来生成唯一字符串UUID(通用唯一标识符)是128位数字,由随机生成的数字和字母组成,可以保证在不同的计算机上生成的值是唯一的。 生成UUID可以使用如下代码: import java.util.UUID; public class UniqueStringGenerator { public static String generate() { UUID uuid = UUID.randomUUID(); return uuid.toString(); 调用该方法后返回一个随机生成的UUID字符串。如果需要去掉UUID中的"-"可以使用`uuid.toString().replaceAll("-", "")`方法。如果需要生成指定格式的唯一字符串,可以对UUID进行格式化处理。 以上是一种使用Java生成唯一字符串的算法,但也不是唯一的解决方案,根据实际需求和场景,还需考虑其他因素如性能、数据安全等。