# hash.rs - source
Source of the Rust file `/home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/xmas-elf-0.7.0/src/hash.rs`.
Keywords: rust, rustlang, rust-lang

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51

    use symbol_table::Entry;
    use zero::Pod;

    #[derive(Clone, Copy, Debug)]
    #[repr(C)]
    pub struct HashTable {
        bucket_count: u32,
        chain_count: u32,
        first_bucket: u32,
    }

    unsafe impl Pod for HashTable {}

    pub fn hash(input: &str) -> u32 {
        let mut result = 0;
        for i in input.bytes() {
            result = (result << 4) + i as u32;
            let g = result & 0xf0000000;
            if g != 0 {
                result ^= g >> 24;
            }
            result &= !g
        }
        result
    }

    impl HashTable {
        pub fn get_bucket(&self, index: u32) -> u32 {
            assert!(index < self.bucket_count);
            unsafe {
                let ptr = (&self.first_bucket as *const u32).offset(index as isize);
                *ptr
            }
        }

        pub fn get_chain(&self, index: u32) -> u32 {
            assert!(index < self.chain_count);
            let index = self.bucket_count + index;
            unsafe {
                let ptr = (&self.first_bucket as *const u32).offset(index as isize);
                *ptr
            }
        }

        pub fn lookup<'a, F>(&'a self, _name: &str, _f: F) -> &'a Entry
            where F: Fn(&'a Entry) -> bool
        {
            // TODO
            unimplemented!();
        }
    }