得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

shell 实现随机数

需要在脚本里实现整一个随机数作为 ut 乱序执行 case 的种子

以下是 linux 中四种常见获得随机整数的方法,除了第一个,后三个,产生随机数的伪数据来源,都与 /dev/random 设备有关

通过时间获得随机数(date)

这个也是经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值

1
2
3
4
5
6
7
8
$ date +%s  # 获得时间戳,当前时间到:1970-01-01 00:00:00 相隔的秒数
# 如果用它做随机数,相同一秒的数据是一样的
# 在做循环处理,多线程里面基本不能满足要求了

$ date +%N # 获得当前时间的纳秒数据,精确到亿分之一秒
# 这个相当精确了,就算在多 cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞

$ date +%s%N # 这个可以说比较完美了,加入了时间戳,又加上了纳秒

通过内部系统变量($RANDOM)

其实,linux 已经提供系统环境变量了,直接就是随机数,这个数是一个小于或等于5位的整数

通过系统内部唯一数据生成随机数(/dev/random,/dev/urandom)

/dev/random 设备存储着系统当前运行的环境的实时数据,可以看作是系统某个时候,唯一值数据,因此可以用作随机数元数据

/dev/urandom 这个设备数据与 random 里面类似,只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞

1
2
3
4
$ head -200 /dev/urandom | cksum | cut -f1 -d" "
# 由于 urandom 的数据是非常多,不能直接通过 cat 读取,这里取前 200 行,其实整个数据都是变化的,取多少也一样是唯一的
# cksum 将读取文件内容,生成唯一的表示整型数据,只有文件内容不变,生成结果就不会变化
# cut 以空格分割,然后得到分割的第一个字段数据

读取 linux 的 uuid

什么是 uuid 呢?

UUID 全称是通用唯一识别码 (Universally Unique Identifier, UUID),是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。与之类似的还有一个 guid(全局唯一标识符),由微软支持

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。它会让网络任何一台计算机所生成的uuid码,都是互联网整个服务器网络中唯一的。它的原信息会加入硬件,时间,机器当前运行信息等等

UUID 格式是:包含 32 个 16 进制数字,以 “-” 连接号分为五段,形式为 8-4-4-4-12 的 32 个字符

例:550e8400-e29b-41d4-a716-446655440000

linux 的 uuid 码由内核提供,在 /proc/sys/kernel/random/uuid 这个文件内。random 目录里还有很多其它文件,都与生成 uuid 有关

1
$ cat /proc/sys/kernel/random/uuid | cksum | cut -f1 -d" "

be slow to promise and quick to perform.