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 <stdlib.h>#include <unistd.h>#include<
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生成唯一字符串的算法,但也不是唯一的解决方案,根据实际需求和场景,还需考虑其他因素如性能、数据安全等。