我希望维护一个(Postgres(SQL数据库,从第三方收集数据。由于大多数数据都是静态的,虽然我每天都会收到一个完整的转储,但我只想存储新数据。也就是说,每天我都会得到 100K 条新记录,比如 300 列,95K 行将是相同的。为了以有效的方式做到这一点,我正在考虑在数据旁边插入我的记录哈希(来自 Pandas 数据帧或 Python 字典(。还会存储其他一些数据,例如将其加载到数据库中的时间。然后,我可以在将数据插入数据库之前,对传入的数据进行哈希处理,并轻松验证记录尚未在数据库中,而不必检查所有 300 列。
我的问题:选择哪个哈希函数(鉴于我在 Python 中并且更喜欢使用非常快速和可靠的解决方案,它需要我这边的编码很少,同时能够处理各种数据,如整数、浮点数、字符串、日期时间等(
-
Python 的
hash
不适合,因为它在每个会话中都会发生变化(例如:在 python pandas 中,使用数据帧中的选定列为每行数据创建哈希值( -
md5
或sha1
是加密哈希。我不需要加密部分,因为这不是为了安全。可能也有点慢,我在字符串方面遇到了一些麻烦,因为这些字符串需要编码。 - 像
CRC
这样的解决方案足够好吗?
对于二和三,如果你推荐,我该如何实现它对于任意字典和熊猫行?我在保持这种简单性方面收效甚微。例如,对于字符串,我需要显式定义编码,并且记录中字段的顺序也不应更改哈希。
编辑:我刚刚意识到依赖Python可能会很棘手,如果我改变编程语言,我最终可能会得到不同的哈希。将其绑定到数据库似乎是更明智的选择。
你试过pandas.util.hash_pandas_object
吗?
不确定这有多高效,但也许你可以这样使用它:
df.apply(lambda row: pd.util.hash_pandas_object(row), axis=1)
这至少会让你得到 df 中每一行的熊猫系列哈希。