shell脚本程序我们有那些获得随机数方法呢?
一、通过时间获得随机数(date)
这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。
|
date +%s 1287764773 获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数 如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。
date +%N
738710457 获得当前时间的纳秒数据,精确到亿分之一秒。 这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞 date +%s%N 1287764807051101270 这个可以说比较完美了,加入了时间戳,又加上了纳秒 2、通过内部系统变量($RANDOM)
其实,linux已经提供有个系统环境变量了,直接就是随机数,哈哈,觉得刚学习方法,是不是白费了!!
echo $RANDOM
10918
echo $RANDOM
10001
连续2次访问,结果不一样,这个数据是一个小于或等于5位的整数
3、通过系统内部唯一数据生成随机数(/dev/random,urandom)
我们知道dev目录下面,是linux一些默认设备,它给我们感觉就是放的是键盘,硬盘,光驱等设备的对应文件了。 其实linux有些设备很特殊,有特殊用途。前面我们说到的:/dev/[udp|tcp]/host/port比较特殊吧。呵呵,有扯远了。 /dev/random设备,存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候,唯一值数据,因此可以用作随机数元数据。我们可以通过文件读取方式,读得里面数据。/dev/urandom这个设备数据与random里面一样。只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞。
直接这小样输出的会是乱码,其实它是通过二进制数据保存实时数据的,那么我们怎么样把它变成整型数据呢?
1615228479 50333 由于urandom的数据是非常多,不能直接通过cat读取,这里取前200行,其实整个数据都是变化的,取多少也一样是唯一的。 cksum 将读取文件内容,生成唯一的表示整型数据,只有文件内容不变,生成结果就不会变化,与php crc函数
head -200 /dev/urandom | cksum | cut -f1 -d " "
484750180
cut 以” “分割,然后得到分割的第一个字段数据
得到整型数据,然后,类似一的方法就可以获得到随机数了。 题外话:在程序里面,我们经常md5得到唯一值,然后是字符串的,如果想表示成整型方式,可以通过crc函数.crc是循环冗余校验,相同数据通过运算,都会得到一串整型数据。现在这种验证应用很广。详细要了解,可以参考:crc. 下面还有个方法,直接从设备读取生成好的uuid码。
4、读取linux 的uuid码
在提到这个之前,有个概念,就是什么是uuid呢?
UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),它 是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。
UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。它会让网络任何一台计算机所生成的uuid码,都是互联网整个服务器网络中唯一的。它的原信息会加入硬件,时间,机器当前运行信息等等。
UUID格式是:包含32个16进位数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。范例;550e8400-e29b-41d4-a716-446655440000 ,所以:UUID理论上的总数为216 x 8=2128,约等于3.4 x 1038。 也就是说若每奈秒产生1兆个UUID,要花100亿年才会将所有UUID用完。
其实,大家做数据库设计时候,肯定听说过,guid(全局唯一标识符)码,它其实是与uuid类似,由微软支持。 这里编码,基本有操作系统内核产生。大家记得把,在windows里面,无论数据库,还是其它软件,很容易得到这个uuid编码。
linux 的uuid码
linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内。其实,random目录,里面还有很多其它文件,都与生成uuid有关系的。
dff68213-b700-4947-87b1-d9e640334196
7b57209a-d285-4fd0-88b4-9d3162d2e1bc
连续2次读取,得到的uuid是不同的
cat /proc/sys/kernel/random/uuid | cksum | cut -f1 -d " "
2141807556
同上方法得到随机整数
是linux下面,几种常见活动随机数整数方法,除了第一个是不同外,其实后3个,产生随机码的伪数据来源,都与/dev/random设备有关系。 |
相关推荐
shell脚本程序我们有那些获得随机数方法呢? 一、通过时间获得随机数(date) 这个也是我们经常用到的,可以说时间是的,也不会重复的,从这个里面获得同一时间的值。适应所有程序里面了。 例子: ...
在Linux运维过程中,掌握Shell脚本的编写...以上就是Shell中生成随机数的多种方法,每种方法都有其适用场景,可以根据实际需求选择合适的方式。理解并灵活运用这些方法,可以极大地丰富Shell脚本的功能,提升工作效率。
总的来说,Linux Shell提供了多种方式来生成随机数和随机字符串,可以根据实际需求选择合适的方法。对于简单的应用,`$RANDOM`变量可能就足够了;对于更复杂的需求,如多线程环境或特定范围的随机数,可能需要使用...
总结来说,Shell脚本生成随机数有多种途径,选择哪种方法取决于具体需求。时间戳结合纳秒数据提供了一种通用的解决方案,而`$RANDOM`变量适合快速简单的随机数生成,`/dev/random`和`/dev/urandom`则在安全性或性能...
通过上述介绍,我们可以看出在 Linux Shell 中生成随机数有多种方法。选择哪种方法取决于具体的应用场景和需求。例如,对于简单的需求,可以使用 `$RANDOM`;而对于高质量随机数的需求,则可以考虑使用 `/dev/...
Linux中有多种Shell类型,如Bash(Bourne Again SHell)、C Shell、Korn Shell等,其中Bash是最常见的一种。 **为何要学习Shell编程?** 学习Shell编程的原因在于其在Linux环境中的核心地位和优势。Linux提倡的是...
比如,对某个数加1可以使用多种不同的方法,包括Shell内置的算术扩展$((i++)),let命令,expr命令,以及awk命令等。文档中也介绍了如何通过while循环实现从1加到某个特定数值的过程。这些基础实例对于初学者来说非常...
以下是几种不同的Shell和AWK脚本实现方法。 1. **Shell方法**: 这种方法利用了Shell的内置变量 `$RANDOM`,它可以生成一个0到32767之间的随机整数。首先,通过`while`循环读取文件的每一行,并在每行末尾添加一个...
书中不仅详细介绍了Bash(Bourne Again Shell)的语法和技巧,还包括了调试、系统调用以及多种实用功能,比如变量使用、参数传递、重定向和管道等。 在UNIX/Linux系统中,shell是系统与用户交互的重要接口,而Bash...
在 Linux 中,有多种方式可以查看环境变量。下面,我们将讨论三种常用的方法。 使用 env 命令 Env 命令是查看环境变量最常用的方法。使用 env 命令可以显示当前系统中所有的环境变量。例如,输入 `env` 命令后,...
生成随机数和随机字符串也是Shell的常见应用,可以结合`awk`或`shuf`等工具实现。最后,清理磁盘中的空文件夹可以通过编写特定的Shell脚本来自动化完成,使用`find`命令配合`rm`命令删除空目录。 Shell编程语言有其...
在Linux或Unix环境中,Shell脚本是日常操作中不可或缺的一部分,尤其在处理文件时。本文将详细介绍如何使用Shell命令从文件中随机抽取若干行。在实际应用中,这可能用于测试、数据分析或者日志抽样等多种场景。 ...
在Linux操作系统中,Shell脚本是一种用于自动化执行命令和任务的编程语言,它是用户与操作系统交互的一种重要方式。从给出的文件内容来看,我们可以提炼出一系列Shell脚本相关的知识点: 1. **脚本基础**:Shell...
【Shell脚本100例】是一份涵盖了多种实用Shell脚本技巧的资源,适合初学者和有一定经验的用户深入学习。以下是从这份文档中提取的一些核心知识点: 1. **Hello World**:这是所有编程语言的基本示例,用于验证脚本...
glibc(GNU C Library)是Linux系统中最主要的C语言库,也是POSIX标准库的一个实现版本。它为开发者提供了丰富的API接口,支持从简单的字符串处理到复杂的网络通信等功能。本文档基于glibc 2.2.x版本,并对其中的...
"极路由免拆机开SSH刷老毛子Padavan" ...极路由SSH免拆机刷PADAVA是一个复杂的过程,需要掌握基础的网络和Linux知识,并需要使用多种工具和软件。但是,它可以提高极路由的安全性和稳定性,并实现远程登录和管理功能。