0

文字列を受け取り、対応する値を定義済みの「比率」を持つ配列に出力するハッシュ関数を作成したいと考えています。たとえば、私の配列が値を保持している場合:

[0] => "output number 1"
[1] => "output number 2"
[2] => "output number 3"

次に、ハッシュ関数int H(string)は範囲内の任意の文字列の値のみを返す必要があり0ます2(入力文字列は常に同じキーを返します)。

問題は、事前定義された比率によっても判断したいということです。たとえば 、指定された文字列は as 、as 、asとして85%ハッシュされます。正規分布をエミュレートできる関数があれば、さらに良くなります。010%15%2

また、頻繁に実行されるため、高速である必要があります。PHPでこれにアプローチする方法について、誰かが私を正しい方向に向けることができますか? これを尋ねたのは私が初めてではないと思いますが、SOを1時間掘り下げました。

編集:

私が今までやってきたことは、ハッシュ関数を に組み込むことcです。上記のハッシュをプロポーションなしで行います (まだ php には慣れていません):

int StringFcn (const void *key, size_t arrSize)
{
    char *str = key;
    int totalAsciiVal = 0;

    while(*str)
    {
        totalAsciiVal += *str++;
    }

    return totalAsciiVal % arrSize;
}
4

1 に答える 1

0

このようなことをするのはどうですか?

// Hash the string so you can pretty much guarantee it will have a number in it and it is relatively "random"
$hash = sha1($string);

// Iterate through string and get ASCII values
$chars = str_split($hash);
$num = 0;
foreach ($chars as $char) {
    $num += ord($int);
}

// Get compare modulo 100 of the number
if ($num % 100 < 85) {
    return 0;
}
if ($num % 100 < 95) {
    return 1;
}
return 2;

編集:

でハッシュする代わりに、crc32sha1を使用して直接十分に大きな整数を取得できます(コメントの@nivrigに感謝します)。

// Convert string to integer
$num = crc32($string);

// Get compare modulo 100 of the number
if ($num % 100 < 85) {
    return 0;
}
if ($num % 100 < 95) {
    return 1;
}
return 2;
于 2013-02-22T23:49:32.057 に答える