/* * 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 #include #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 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 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 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