如何将输入映射到具有相同输出和均匀分布保证的输出?

问题描述 投票:1回答:1

我有一组可变大小String的输入(在我的情况下为N),我需要映射到一组固定大小M的输出(在我的情况下为数组的索引)。因此,我基本上需要一个类似的功能:

fn map(input: String) -> usize;

我需要保证两件事:

  1. 对于任何输入X,我必须始终返回相同的输出Y。例如:每次我将字符串"hello"传递给函数时,返回的值必须始终相同,例如1
  2. 返回值的分布必须是均匀的,也就是说,对于无限数量的输入,相同返回值的平均值必须相同。例如,如果我有M = 4个不同的值要返回,并且我有N = 100个不同的输入,则映射到每个输出的输入数必须在理想情况下等于25

我想出了以下代码:

use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

fn main() {
    let bucket = Bucket::new(5);
    let inputs = ["hello", "world", "house", "hi"];

    for input in &inputs {
        let output = bucket.get(input);
        assert_eq!(output, bucket.get(input));
        println!("{} -> {}", input, output);
    }
}

pub struct Bucket {
    values: Vec<usize>,
}

impl Bucket {
    pub fn new(size: usize) -> Self {
        let values = (0..size).collect();
        Bucket { values }
    }

    pub fn get<T: Hash>(&self, id: &T) -> usize {
        let mut hasher = DefaultHasher::new();
        Hash::hash(id, &mut hasher);
        let index = (hasher.finish() % self.values.len() as u64) as usize;
        self.values[index]
    }
}

Link to Playground

我认为上面的代码保证第一个点(对于相同的输入总是相同的输出),但不一定是第二个点(分布的均匀性。)>

是否有这样的功能的快速实现,可以确保两点都得到保证?

我有一组可变大小N的输入(在我的情况下为字符串),我需要映射到一组固定大小M的输出(在我的情况下为数组的索引)。因此,我基本上需要一个函数例如:fn map(...

hash rust mapping distribution uniform-distribution
1个回答
1
投票

我认为您的实现的第一点是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.