88 lines
1.4 KiB
C++
88 lines
1.4 KiB
C++
/*
|
|
* Copyright 2013 Haiku, Inc. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Paweł Dziepak, pdziepak@quarnos.org
|
|
*/
|
|
#ifndef KERNEL_UTIL_RANDOM_H
|
|
#define KERNEL_UTIL_RANDOM_H
|
|
|
|
|
|
#include <smp.h>
|
|
#include <SupportDefs.h>
|
|
|
|
|
|
#define MAX_FAST_RANDOM_VALUE 0x7fff
|
|
#define MAX_RANDOM_VALUE 0x7fffffffu
|
|
#define MAX_SECURE_RANDOM_VALUE 0xffffffffu
|
|
|
|
static const int kFastRandomShift = 15;
|
|
static const int kRandomShift = 31;
|
|
static const int kSecureRandomShift = 32;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
unsigned int fast_random_value(void);
|
|
unsigned int random_value(void);
|
|
unsigned int secure_random_value(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
template<typename T>
|
|
T
|
|
fast_get_random()
|
|
{
|
|
size_t shift = 0;
|
|
T random = 0;
|
|
while (shift < sizeof(T) * 8) {
|
|
random |= (T)fast_random_value() << shift;
|
|
shift += kFastRandomShift;
|
|
}
|
|
|
|
return random;
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
T
|
|
get_random()
|
|
{
|
|
size_t shift = 0;
|
|
T random = 0;
|
|
while (shift < sizeof(T) * 8) {
|
|
random |= (T)random_value() << shift;
|
|
shift += kRandomShift;
|
|
}
|
|
|
|
return random;
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
T
|
|
secure_get_random()
|
|
{
|
|
size_t shift = 0;
|
|
T random = 0;
|
|
while (shift < sizeof(T) * 8) {
|
|
random |= (T)secure_random_value() << shift;
|
|
shift += kSecureRandomShift;
|
|
}
|
|
|
|
return random;
|
|
}
|
|
|
|
|
|
#endif // __cplusplus
|
|
|
|
#endif // KERNEL_UTIL_RANDOM_H
|
|
|