0

この質問がこの形式に対して漠然としすぎているかどうかはわかりませんが、具体的にしようと思います。

製品情報を JSON オブジェクトとして保存する Google Apps Script ScriptDB に追加しています。あまりにも多くのオブジェクトまたは大きすぎるオブジェクトがある場合の動作が信頼できないため、次のように保存する必要があると思います。

{
    "bucket": "AB",
    "data": {
        "AB8000": {
            "price": 25.99,
            "qty": 29,
            "tstamp": 1358861169691,
        },
        "AB0900": {
            "price": 24.99,
            "qty": 0,
            "tstamp": 1358861169691,
        }
    }
}

約 25,000 の製品があり、SKU (たとえば AB8000) をパラメーターとして取り、その SKU を割り当てるバケットを返すアルゴリズムが必要です。

私の問題は、SKU の分布が不均一であることです。最初の 2 文字 (「AB」) を使用しても機能しませんでした。これは、一部のバケットには 2,500 メンバーが含まれ、一部のバケットには 5 メンバーが含まれるためです。 (明らかに) 100 個のバケットが生成され、最大のものには約 600 個のメンバーがあります。600 人のメンバーは、問題が発生し始めるほぼマジック ナンバーのようです。

それらをある程度均等に確実に分散させるために、SKU で実行できる数学またはハッシュ関数はありますか? すべてのバケットがまったく同じサイズである必要はありませんが、理想的には、最大のバケットで約 400 を超えず、合計で 50 ~ 100 のバケットが必要です。

- 編集:

私は今、このような機能を試しています:

var sum = 0;
for (var i = 0; i < sku.length; i++) {
  sum = sum + sku.charCodeAt(i);
}

var bucket = sum % M; // M is bucket size

return bucket;

しかし、これもそれらを均等に分散しません。「M」に 100 の値を使用すると、次の分布が得られます。 1 1 1 1 4 7 12 9 19 31 38 61 91 107 151 152 184 216 249 290 317 335 362 392 446 511 513 571 574 604 657 680 680 697 716 703 698 687 701 677 672 683 679 655 671 662 640 629 651 623 596 556 532 485 425 384 314 245 204 163 125 91 59 39 27 19 11 11 10 6 6

「M」に 60 の値を使用すると、次のようになります。

677 672 683 679 655 671 662 640 629 651 623 596 556 532 485 425 384 314 245 204 163 125 91 59 40 31 26 23 20 29 37 44 63 92 107 151 152 184 217 250 290 317 336 363 392 446 511 513 571 574 604 657 680 679 697 716 703 698 687

4

1 に答える 1

1

ほぼすべてのハッシュスキームがそれを行います。コメンターが示唆するように、文字を追加して% 100から、バケットを選択します。

于 2013-01-22T16:35:01.670 に答える