[U-Boot] [PATCH v2] tools: gen_eth_addr: add getpid() to time(0) to avoid duplicated seed

As 'time(0) | getpid()' will have a lot of duplicated value. It is not a expected behavior. We expect different value for the seed when when run it in many times.
So this patch will left shift the getpid() and add to time(0). That avoid duplicated value.
Test command is like: % RUN=0; while [ $RUN -lt 10000 ]; do tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 10000
This patch is incorporated with suggestions made by Wolfgang Denk and Andreas Bießmann. Thanks them a lot.
Signed-off-by: Josh Wu josh.wu@atmel.com ---
Changes in v2: - left shift and add the getpid() value instead of removing it.
tools/gen_eth_addr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/gen_eth_addr.c b/tools/gen_eth_addr.c index bf9d935..5fa3e0c 100644 --- a/tools/gen_eth_addr.c +++ b/tools/gen_eth_addr.c @@ -15,7 +15,7 @@ main(int argc, char *argv[]) { unsigned long ethaddr_low, ethaddr_high;
- srand(time(0) | getpid()); + srand(time(0) + (getpid() << 8));
/* * setting the 2nd LSB in the most significant byte of

On 09/16/2015 12:21 PM, Josh Wu wrote:
As 'time(0) | getpid()' will have a lot of duplicated value. It is not a expected behavior. We expect different value for the seed when when run
when when ... could be fixed when applied
it in many times.
So this patch will left shift the getpid() and add to time(0). That avoid duplicated value.
Test command is like: % RUN=0; while [ $RUN -lt 10000 ]; do tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 10000
This patch is incorporated with suggestions made by Wolfgang Denk and Andreas Bießmann. Thanks them a lot.
Signed-off-by: Josh Wu josh.wu@atmel.com
Acked-by: Andreas Bießmann andreas.devel@googlemail.com
Changes in v2:
- left shift and add the getpid() value instead of removing it.
tools/gen_eth_addr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/gen_eth_addr.c b/tools/gen_eth_addr.c index bf9d935..5fa3e0c 100644 --- a/tools/gen_eth_addr.c +++ b/tools/gen_eth_addr.c @@ -15,7 +15,7 @@ main(int argc, char *argv[]) { unsigned long ethaddr_low, ethaddr_high;
- srand(time(0) | getpid());
srand(time(0) + (getpid() << 8));
/*
- setting the 2nd LSB in the most significant byte of

Dear Josh Wu,
In message 1442398864-1312-1-git-send-email-josh.wu@atmel.com you wrote:
As 'time(0) | getpid()' will have a lot of duplicated value. It is not a expected behavior. We expect different value for the seed when when run it in many times.
So this patch will left shift the getpid() and add to time(0). That avoid duplicated value.
Test command is like: % RUN=0; while [ $RUN -lt 10000 ]; do tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 10000
This patch is incorporated with suggestions made by Wolfgang Denk and Andreas Bießmann. Thanks them a lot.
Signed-off-by: Josh Wu josh.wu@atmel.com
Changes in v2:
- left shift and add the getpid() value instead of removing it.
tools/gen_eth_addr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
I ran this version through a total of 80,000 runs ; there were no duplicated addresses found in this test.
Acked-by: Wolfgang Denk wd@denx.de Tested-by: Wolfgang Denk wd@denx.de
Thanks!
Best regards,
Wolfgang Denk

On Wed, Sep 16, 2015 at 06:21:04PM +0800, Josh Wu wrote:
As 'time(0) | getpid()' will have a lot of duplicated value. It is not a expected behavior. We expect different value for the seed when when run it in many times.
So this patch will left shift the getpid() and add to time(0). That avoid duplicated value.
Test command is like: % RUN=0; while [ $RUN -lt 10000 ]; do tools/gen_eth_addr; RUN=$(($RUN+1)); done | sort | uniq | wc -l 10000
This patch is incorporated with suggestions made by Wolfgang Denk and Andreas Bießmann. Thanks them a lot.
Signed-off-by: Josh Wu josh.wu@atmel.com Acked-by: Andreas Bießmann andreas.devel@googlemail.com Acked-by: Wolfgang Denk wd@denx.de Tested-by: Wolfgang Denk wd@denx.de
Applied to u-boot/master, thanks!
participants (4)
-
Andreas Bießmann
-
Josh Wu
-
Tom Rini
-
Wolfgang Denk