免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7801 | 回复: 9
打印 上一主题 下一主题

[函数] 有没有返回精确到毫秒的时间函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-01 22:30 |只看该作者 |倒序浏览
time.h里的函数,time(NULL)返回当前时间。但是这个函数的返回值是精确到秒的。有没有精确到毫秒的函数?

是这样的,我需要产生随机数。一般来说用时间作种子就可以了,但是我的应用中有可能一秒钟之内需要产生不止一次随机数。所以用time(NULL)作种子的话,只要还在那一秒之内,产生的随机数就是相同的。

现在我只能用静态变量自增的方法来产生随机数:srand(seed++),但总是感觉有点别扭。有没有更好的方法?

论坛徽章:
0
2 [报告]
发表于 2006-10-01 22:37 |只看该作者
用/dev/random,这是真正的随机源。/dev/urandom,这是伪随机源,速度快些。

论坛徽章:
0
3 [报告]
发表于 2006-10-01 22:42 |只看该作者
老实说,我不太熟悉linux函数。不过我想脱离平台依赖性,所以尽量数用c/c++自己的函数。

论坛徽章:
0
4 [报告]
发表于 2006-10-01 22:58 |只看该作者
老实说,你可以写个平台抽象库,把这些和平台相关的东西都抽象成为统一的接口。

密码学支持应该集成到系统里的,所以无法避免和操作系统打交道。

如果你实在不愿意这样的话,建议你使用OpenSSL。在win32上和在*nix上的抽象都已经完成,密码学函数也比较完善。你可以试试。

C/C++自己的这类函数不存在。应该说,这种函数在ANSI C中没有定义,所以你必须借助外部库。

[ 本帖最后由 langue 于 2006-10-1 22:59 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-10-01 23:28 |只看该作者
thx for reply

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
6 [报告]
发表于 2006-10-01 23:29 |只看该作者
原帖由 langue 于 2006-10-1 22:37 发表
用/dev/random,这是真正的随机源。/dev/urandom,这是伪随机源,速度快些。


用/dev/random你就等去吧!

楼主的问题根本就没那么复杂,标准C中的rand(),使用前srand()搞一下。没必要总是srand(),楼主根本没理解函数用法。

/dev/random数量和速度都根不上,提供给srand还不错,要用他做提取,呵呵,没戏。

论坛徽章:
0
7 [报告]
发表于 2006-10-01 23:38 |只看该作者
原帖由 醉卧水云间 于 2006-10-1 23:29 发表


用/dev/random你就等去吧!

楼主的问题根本就没那么复杂,标准C中的rand(),使用前srand()搞一下。没必要总是srand(),楼主根本没理解函数用法。

/dev/random数量和速度都根不上,提供给srand还不错,要 ...


呵呵,一个不经意,自己也弄了个half-truth出来。

/dev/random通过中断等随机源获得数据,所以要获得足够的随机数据还是比较慢的;这也就是为什么大多数情况下都要用/dev/urandom,并且尽量在系统启动和关闭的时候分别导入、保存一定数目的random seed。

不过说实在的,OpenSSL中*nix下RAND的实现就是通过读取/dev/urandom来获得伪随机源。

注意随机和伪随机的区别。

谢谢JohnBull的指正。

[ 本帖最后由 langue 于 2006-10-2 01:11 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-10-02 00:53 |只看该作者
原帖由 langue 于 2006-10-1 23:38 发表
不过说实在的,glibc中rand()的实现就是通过读取/dev/urandom来获得伪随机数


不是的,是在用户态线性同余产生的。

论坛徽章:
0
9 [报告]
发表于 2006-10-02 00:57 |只看该作者
原帖由 JohnBull 于 2006-10-2 00:53 发表


不是的,是在用户态线性同余产生的。


这两天头脑不清楚,把glibc和openssl混一块儿了。别见怪啊。

file:/usr/src/lib/openssl/crypto/md/rand_win.c

#else /* Unix version */

#include <time.h>

int RAND_poll(void)
{
        unsigned long l;
        pid_t curr_pid = getpid();
#ifdef DEVRANDOM
        FILE *fh;
#endif

#ifdef DEVRANDOM
        /* Use a random entropy pool device. Linux, FreeBSD and OpenBSD
         * have this. Use /dev/urandom if you can as /dev/random may block
         * if it runs out of random entries.  */

        if ((fh = fopen(DEVRANDOM, "r")) != NULL)
                {
                unsigned char tmpbuf[ENTROPY_NEEDED];
                int n;
               
                setvbuf(fh, NULL, _IONBF, 0);
                n=fread((unsigned char *)tmpbuf,1,ENTROPY_NEEDED,fh);
                fclose(fh);
                RAND_add(tmpbuf,sizeof tmpbuf,n);
                memset(tmpbuf,0,n);
                }
#endif

        /* put in some default random data, we need more than just this */
        l=curr_pid;
        RAND_add(&l,sizeof(l),0);
#ifndef VXWORKS
        l=getuid();
        RAND_add(&l,sizeof(l),0);
#endif

        l=time(NULL);
        RAND_add(&l,sizeof(l),0);

#ifdef DEVRANDOM
        return 1;
#else
        return 0;
#endif
}


谢谢指正。

[ 本帖最后由 langue 于 2006-10-2 01:09 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-10-02 18:27 |只看该作者
原帖由 醉卧水云间 于 2006-10-1 07:29 发表


用/dev/random你就等去吧!

楼主的问题根本就没那么复杂,标准C中的rand(),使用前srand()搞一下。没必要总是srand(),楼主根本没理解函数用法。


这个是正解,可能楼主误认为每次抽随机数都要srand了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP