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的分布不均匀。使用前两个字符(“AB”)不起作用,因为有些桶有 2,500 个成员,有些桶有 5 个。我能做的最好的是 (SKU[3] + SKU[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 回答