1

我需要在我的数据库中存储大型(30K 未压缩)JSON 字符串。我正在使用 gzip 压缩字符串,因此使用 MySQL 的 BLOB 数据类型来存储它。但是,只有 5% 的请求包含唯一数据,并且只有唯一数据需要存储在数据库中。

我的方法如下。

  1. array_multisort数据(数组[a, b, c]实际上与 相同[a, c, b])。
  2. json_encode数据(json_encode比 快;我们需要第3serialize步的字符串数组表示)。
  3. sha1数据(比 慢md5,但不太可能发生冲突)。
  4. 检查数据库中是否存在哈希。
    • 存在:不插入数据。
    • 新:gzip 数据并将其存储在散列中。

这有什么(除了首先将 JSON 数据存储到数据库之外)听起来很可疑或应该以不同的方式完成吗?

该数据库每月创建大约 1kk 条唯一记录。

4

1 回答 1

0

在我看来,您正在做的是某种 L2/持久/分布式缓存。

整个过程是非常正确的,但是您应该考虑使用适合您的环境并具有最佳性能的哈希算法。

MD5 有 128 位,而 SHA-1 有 160 位。差别很大!虽然 MD5 可能有 2^128 (~3.4x10^38),但 SHA-1 可能有 2^160 (~1.4x10^48)。您认为使用 MD5 会发生冲突吗?

最好的情况下,假设每月有 100 万条唯一记录 (10^6),您将需要大约 3.4x10^32 个月才能发生冲突。当然,这些都是理论值,即使 MD5 在 2^128 上分布不均。

此外,如果您认为应该丢弃旧值(如 LRU 算法),因为它们不再与存储相关,您甚至可以使用更简单、更快的哈希算法。

如果无论如何,性能和/或存储容量都不是问题,请坚持使用 SHA-1,它的持续时间要长得多,碰撞的可能性要小得多。

干杯!

于 2012-08-27T22:18:36.877 回答