-pub struct OsRng {
- hcryptprov: c::HCRYPTPROV
-}
-
-impl OsRng {
- /// Create a new `OsRng`.
- pub fn new() -> io::Result<OsRng> {
- let mut hcp = 0;
- let ret = unsafe {
- c::CryptAcquireContextA(&mut hcp, 0 as c::LPCSTR, 0 as c::LPCSTR,
- c::PROV_RSA_FULL,
- c::CRYPT_VERIFYCONTEXT | c::CRYPT_SILENT)
- };
-
- if ret == 0 {
- Err(io::Error::last_os_error())
- } else {
- Ok(OsRng { hcryptprov: hcp })
- }
- }
-}
-
-impl Rng for OsRng {
- fn next_u32(&mut self) -> u32 {
- let mut v = [0; 4];
- self.fill_bytes(&mut v);
- unsafe { mem::transmute(v) }
- }
- fn next_u64(&mut self) -> u64 {
- let mut v = [0; 8];
- self.fill_bytes(&mut v);
- unsafe { mem::transmute(v) }
- }
- fn fill_bytes(&mut self, v: &mut [u8]) {
- // CryptGenRandom takes a DWORD (u32) for the length so we need to
- // split up the buffer.
- for slice in v.chunks_mut(<c::DWORD>::max_value() as usize) {
- let ret = unsafe {
- c::CryptGenRandom(self.hcryptprov, slice.len() as c::DWORD,
- slice.as_mut_ptr())
- };
- if ret == 0 {
- panic!("couldn't generate random bytes: {}",
- io::Error::last_os_error());
- }
- }
- }
-}
-
-impl Drop for OsRng {
- fn drop(&mut self) {
- let ret = unsafe {
- c::CryptReleaseContext(self.hcryptprov, 0)
- };
- if ret == 0 {
- panic!("couldn't release context: {}",
- io::Error::last_os_error());
- }
+pub fn hashmap_random_keys() -> (u64, u64) {
+ let mut v = (0, 0);
+ let ret = unsafe {
+ c::RtlGenRandom(&mut v as *mut _ as *mut u8,
+ mem::size_of_val(&v) as c::ULONG)
+ };
+ if ret == 0 {
+ panic!("couldn't generate random bytes: {}",
+ io::Error::last_os_error());