我需要在我的数据库中存储大型(30K未压缩)JSON字符串。我使用gzip压缩字符串,因此使用MySQL的BLOB数据类型来存储它。但是,只有5%的请求包含唯一数据,并且只需要将唯一数据存储在数据库中。
我的方法如下。
array_multisort
数据(数组[a, b, c]
与[a, c, b]
几乎相同)。json_encode
数据(json_encode
比serialize
快;我们需要字符串数组表示步骤 3 。)sha1
数据(慢于md5
,但碰撞可能性较小)。除了将JSON数据存储到数据库之外,还有什么相关的东西听起来很腥或者应该以不同的方式完成吗?
数据库每月创建大约1kk的唯一记录。
答案 0 :(得分: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,持续时间更长,碰撞机会更少。
干杯!