【问题标题】:Un-ordered 2 string hash function that always produces the same hash总是产生相同哈希的无序 2 字符串哈希函数
【发布时间】:2020-07-16 21:04:48
【问题描述】:

我正在尝试构建一个可以检查目的地 A 到 B 之间价格的旅行应用程序,我有一个表格以 fromto 的形式存储数据

CREATE TABLE PRICES {
   from varchar,
   to varchar
   price

问题是,如果 from = Ato = B 如果我尝试搜索价格表 B -> A 我没有得到任何结果。即SELECT * from prices where from = 'B' AND to = 'A'当然我可以通过像SELECT * from prices where from = 'A' And To = 'B' OR from = 'B' and 'To' = 'A'这样的查询来解决这个问题

有没有一种方法可以创建一个哈希,这样我就不需要执行此OR 查询,而是我只需执行类似SELECT * from prices where hash = 'C' 的操作,在这种情况下,C 将是一个值这样hash(a, b) = c = hash(b,a) 然后我可以将c 存储在表中,我不需要执行OR 查询。

如果有帮助,我正在使用 Go 顺便说一句,但您可以使用任何语言/伪代码提出哈希函数。

谢谢

【问题讨论】:

  • 对值进行排序:a := from; b := to; if a > b { b, a = a, b }; hash := fmt.Sprintf("%s\t%s", a, b)
  • 您假设从 A 到 B 的价格与从 B 到 A 的价格相同。这不太可能是普遍正确的。我当然不想在代码中建立这种假设。
  • @JimMischel 不仅不是“普遍正确的”,而且不是很常见。例如,您经常会看到假期开始时从假期目的地返回的航班比出境航班便宜得多。
  • @Fogmeister 是的,我经常倾向于低估事情。
  • @JimMischel 它不是根据航班价格创建的。它更像是公共交通应用程序,实际上从 A -> B 的价格总是与从 B -> A 在给定时间范围内的价格相同。

标签: mongodb algorithm go math hash


【解决方案1】:

对字符串进行排序,用分隔符连接并返回结果。

func abOrBa(a, b string) string {
    if a > b {
       a, b = b, a
    }
    return fmt.Sprintf("%s\t%s", a, b)
}

Run it on the playground.

成本可能不是问题 cmets 中所述的 symmetric。如果是这样,这种方法可能没有任何价值。

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多