【发布时间】:2021-05-05 14:39:01
【问题描述】:
我想创建一个散列函数,给定一个时间戳,它将返回一个整数散列以用作“有序索引”
statement: x > y = f(x) > f(y) // x, y are primitive long timestamps (e.g. 1612181315000)
// f(x) or f(y) is aimed to be used in the frontend as "ordered index"
我计划将这个新的“有序索引”而不是真正的时间戳返回给前端,这将允许我“按时间”对前端消费者的结果进行排序,而不是出于隐私原因返回真正的时间戳。
但是,一些真实的时间戳(标记为可见)将返回到前端。因此,不能使用线性函数,因为可以为不可见的时间戳计算此静态偏移量。
一些限制:
- 需要为每个时间戳执行解决方案(我们无法预先对时间戳进行分组)
- 我认为线性函数是不可能的,因为有时我们还要传递真正的时间戳,因此可以在前端使用时间戳和 f(timestamp) 轻松计算偏移量。
请您指出一个可行的算法/解决方案吗?
提前致谢。
【问题讨论】:
-
"x > y = f(x) > f(y)" 那是不可能的。哈希函数生成哈希码,32位哈希码不能代表所有输入的所有不同值,这意味着一些不同的输入可能会生成相同的哈希码,即
x > y = f(x) >= f(y)可能是可行的。 -
您需要支持什么日期范围?例如。如果
f(x) = x / 10000,那么您将在 10 秒块中获得相同的哈希码,并支持从1289-06-28到2650-07-05的日期范围。 -
您只能获得 1289 - 2650 年的日期范围和 10 秒的块。如果您更改为
f(x) = x / 1000以获得相同哈希码的1 秒块,则支持的日期范围将减少到1901-12-14到2038-01-18。 --- 这就是为什么我们会在 2038 年看到另一个“千年虫”错误,因为仍然有代码将时间存储为 32 位值中自纪元以来的秒数。 -
是否可以在要散列的数据中放入一个序列号,然后使用散列值的位子集来存储该序列号?可能需要额外的工作来确保剩余的“散列”位仍然是表现良好的散列函数。
-
几年前,我们研究是否可以在端到端加密文件存储解决方案中添加一些服务器端搜索功能。该问题与您的问题相似,在不知道您正在处理的实际数据的情况下进行有意义的计算。我所知道的唯一“真正”的解决方案是使用同态密码学,但 AFAIK 到今天仍然不可行。编辑:在你的情况下,即使是同态密码学也行不通,因为知道有序列表本身就是问题,会泄露信息。
标签: java algorithm sorting math hash