【问题标题】:Saving combinations of ids with volume保存 id 和卷的组合
【发布时间】:2015-12-10 12:07:04
【问题描述】:

我正在尝试创建一个系统,用户可以在其中创建包含数量众多的产品的杂货清单。

背景。


我正在设计的应用程序包含一个购物清单,其中包含正在订购的产品的 ID。用户 A 订购的购物清单应该可供用户 B 和所有其他用户使用。用户还可以查看订购次数最多的购物清单,并且每个购物清单还必须包含此列表中每种产品的数量。

(可能的)解决方案。


我能想出的一个解决方案是从这些列表中生成一个唯一的哈希。获取产品的 id 并将其与体积相乘,然后将这些值中的每一个相加以得出此特定列表的哈希值。创建两个表。

  1. 包含哈希值以及人们订购此列表的次数。
  2. 使用哈希作为唯一 ID 并包含实际产品和数量的查找表。

这样你就可以立即看到被订购最多的列表,并且可以得到这个列表的内容。

问题。


一个非常大的问题是我在计算列表的哈希值时害怕哈希冲突。

是否有任何其他“更简单”或“更好”的方法来解决这个问题和/或在坚持自己的解决方案时应该使用什么散列算法。

编辑 1.


cmets 中提出的建议确实可以提供可行的解决方案。但是,仍然有一些事情困扰着我。例如,一个包含两个项目的列表:第 2 卷的项目 A 和第 3 卷的项目 B。有些人使用此列表立即订购,而其他人更喜欢制作自己的列表。有了这个解决方案,就没有简单快捷的方法来发现其他人之前是否已经提交过新列表。在保存列表之前,我必须在更新现有列表或添加新列表之前检查每个现有列表是否数量和项目匹配。

对于包含大约 50.000 到 100.000 个列表的数据库,这是否会影响查询,或者我是否会创建在这种情况下不存在的问题?

【问题讨论】:

  • 也许你有一个你没有让我们知道的原因,但是哈希有原因吗?为什么不只拥有一个表lists,其具有唯一的自动增量主键list_id,该表的外键指向包含与该列表关联的所有杂货项目的list_items 表。然后你可以有一个customer_lists 外部参照表,其中customer_idlist_id 将这些项目关联在一起。这样,客户可以拥有多个列表,并且所有内容都是相关的。
  • 我认为让它独一无二的好方法是使用哈希。这似乎容易多了。因此,如果我想将频率添加到列表中,我只需在列表表上增加一个整数?
  • 就是这样,你明白了。您也可以拥有其他统计字段,例如:create_dateupdate_datelast_used_datefrequency_of_uselikes 等...
  • 哈希码不是唯一的。如果它们是唯一的,则永远不会有任何哈希冲突。如果你想要一个东西的唯一标识符,你需要保证它是唯一的。对于低容量数据库,自动递增 ID 列在这方面做得很好。对于更高的容量,常见的方法是转换到universally unique identifier
  • 我唯一担心的是,如果用户输入一个新列表,则无法快速检查该列表是否已在数据库中。我必须检查数据库中的每个条目以获取该项目,然后检查每个匹配的条目与给定的卷。这只是一个项目,想象一下像一个包含超过 1 个项目的列表。

标签: database algorithm hash unique combinations


【解决方案1】:

取决于你有多少物品。假设您使用一个良好的标准哈希算法,该算法为您提供均匀分布,您只有在接近 sqrt(可能的输出数)时才会达到高碰撞机会。因此,为您提供 32 位值的散列应该适用于数千个条目。切换到 64 位,您需要有大约 40 亿个条目才能开始看到哈希冲突。

减轻冲突的一种简单方法是在查找后仔细检查值,如果它们不匹配,则将一些值添加到哈希总和中,然后重试。

您也可以选择更高的位数 MD5 通常用于散列密码。 SHA 可以为您提供加密保证。但是对于您的应用程序来说,两者都可能是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2021-12-14
    • 2015-04-20
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多