【问题标题】:How to encode string that give different encode character for same original string character?如何编码为相同的原始字符串字符提供不同编码字符的字符串?
【发布时间】:2018-07-01 05:05:28
【问题描述】:

我们有一个电子商务网站,其中一个项目(移动)具有两种类别。一个是'good-mobiles',另一个是'bad-mobiles'

我们通过对某个参数进行一些计算来决定这一点。

我们有两个数据库表,一个存储所有好手机(表名:gMobiles),另一个存储所有坏手机(表名:bMobiles)。我们在前面添加 'g' 或 'b' 并带有一些自动递增的 id 并将其存储在相应的表中。

所以gMobiles 包含所有以“g”开头的 id,bMobiles 包含所有以“b”开头的 id。我们将这个 ids 添加到详细信息页面的 url 中。

现在的问题是用户可以通过查看 url 或将鼠标悬停在桌面列表页面上的项目上轻松识别移动设备的好坏。

为了解决这个问题,我们想到了使用编码(例如 base64 编码),但编码的问题是编码字符串中的“g”被其他一些字符替换,并且对于所有“g”,它总是给出相同的字符,所以它不会解决我们的问题。

Orig Text | Encoded Text
----------|-------------
    g1234 | ZDEyMz
    g1267 | ZDEyUS
    b3456 | YTEyMz
    b7654 | YTMyQs
    g7654 | ZDMyQs

我们没有使用加密,因为加密的字符串会很长(对于 8 个字符的输入字符串,它将给出 40-50 个字符)。

是否有任何方法可以对结果字符串进行排序,并且仅通过查看 URL 就无法确定移动设备的好坏。

【问题讨论】:

  • 为什么不对每个产品都使用 GUID?
  • 我会争辩说,首先为好手机和坏手机分别设置表格是一个糟糕的设计选择,假设唯一能区分好坏的是我想要的一个属性建议使用单个表格并添加一列来指示移动设备的好坏。这样一来,您根本不必向用户公开这些信息,并且您拥有更好的数据库设计。
  • “选择 32 个字符的查询会影响性能” - 我非常怀疑这会不会很明显。
  • @yajiv 你错了。如果使用 GUID 会“减慢”您的查询,那么您有一个严重的设计和实现问题
  • 可能吗?几乎可以确定。假设您控制 ID 生成,您可以使用秘密盐对 ID 进行散列,然后只查看散列的最后一位,如果它不是您想要的方式,则丢弃该 ID。这是一个非常非常糟糕的主意。您不应该尝试在 ID 中嵌入额外信息。

标签: c# .net encoding encode


【解决方案1】:

您的问题源于不正确的数据库设计。您可以全力以赴并尝试解决此选择,但更明智的方法是修改该设计。

不要将实体存储在不同的表中,因为它们有一个属性不同。接下来是什么,grMobiles 代表好的红色手机,bbMobiles 代表坏的黑色手机?为什么还要在主键前面加上前缀呢?它已经在表名中。

解决方案是将“质量”属性保存在同一张表的单独列中。这将解决您所有的问题,并且将来甚至可以让您出售“平庸”的手机,区分好坏。

【讨论】:

  • 没错!下一轮将是 grsMobiles 与 bblMobiles。猜猜 s 和 l 代表什么? :-)
  • @ZoharPeled 短&长?
  • @Rafalon 几乎......我在考虑大小。
  • @ZoharPeled 足够接近 ^^
  • @ZoharPeled 如果是糟糕的黑色紧凑型手机会更有趣,你不觉得吗? :D
【解决方案2】:

正如这里的许多其他人所指出的,根本原因是数据库设计,您应该对其进行更改。如果出于某种原因,您不能这样做,那么您可以考虑稍微隐藏前缀。

一种选择是说所有字符a-m 代表g,而所有其他字符n-z 代表b。这意味着您可以随机决定将 ID g1234 编码为 a1234h1234l1234,但是当您必须对其进行解码时,您会知道它们都表示 @987654329 @。

另一个规则可以是所有元音a,e,i,o,u,y代表g,所有辅音代表b。同样,这将使您能够将i1234 解码为g1234,但将h1234 解码为b1234

对于非常精明的网站用户来说,这可能仍然可以检测到,但是 IME,大多数用户甚至不会查看地址栏来查看他们的连接是否安全......

即便如此,您也可以发明自己的算法。你只需要它在解码时是确定性的。

但是你真的应该改变数据库设计。

【讨论】:

    【解决方案3】:

    如前所述,您应该更改表格的设计,以便您只有一个带有附加列的表格。

    如果您无法更改此设置,另一种解决方案可能是在 POST 请求而不是 GET 请求中传递 id,因此它不会 显示在 URL 中

    人们仍然可以判断您的手机是好是坏,但对于大多数用户而言,这并不显而易见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 2016-02-17
      • 1970-01-01
      • 2013-12-29
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多