我有一个有趣的问题,可以通过多种方式解决:
- 我有一个接收字符串的函数。
- 如果此函数以前从未见过此字符串,则需要执行一些处理。
- 如果函数之前已经看到过字符串,则需要跳过处理。
- 在指定的时间后,该函数应该接受重复的字符串。
- 这个函数可能每秒调用数千次,字符串数据可能非常大。
这是对实际应用的高度抽象的解释,只是为了问题的目的而试图深入到核心概念。
该函数将需要存储状态以检测重复项。它还需要存储关联的时间戳以使重复项过期。
它不需要存储字符串,字符串的唯一哈希就可以了,前提是没有由于冲突导致的误报(使用完美的哈希?),并且哈希函数足够高效。
天真的实现很简单(在 C# 中):
Dictionary<String,DateTime>
尽管为了降低内存占用和潜在地提高性能,我正在评估一个自定义数据结构来处理这个问题,而不是一个基本的哈希表。
那么,鉴于这些限制,您会使用什么?
编辑,可能会改变提议的实施的一些附加信息:
- 99% 的字符串不会重复。
- 几乎所有的副本都将背靠背或几乎按顺序到达。
- 在现实世界中,该函数将从多个工作线程中调用,因此需要同步状态管理。