Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按时间戳创建有序哈希函数_Java_Algorithm_Sorting_Math_Hash - Fatal编程技术网

Java 按时间戳创建有序哈希函数

Java 按时间戳创建有序哈希函数,java,algorithm,sorting,math,hash,Java,Algorithm,Sorting,Math,Hash,我想创建一个哈希函数,给定一个时间戳,它将返回一个整数哈希作为“有序索引” 我计划将这个新的“有序索引”而不是实际时间戳返回到前端,这将允许我“按时间”对前端消费者进行排序,因为出于隐私原因,不返回实际时间戳 但是,一些实际时间戳(标记为可见)将返回到前端。因此,如果可以为不可见的时间戳计算此静态偏移量,则不能使用线性函数。 一些限制条件: 需要为每个时间戳执行解决方案(我们不能事先对时间戳进行分组) 我认为线性函数是不可能的,因为有时我们也传递真实的时间戳,在前端使用时间戳和f(时间戳)可以

我想创建一个哈希函数,给定一个时间戳,它将返回一个整数哈希作为“有序索引”

我计划将这个新的“有序索引”而不是实际时间戳返回到前端,这将允许我“按时间”对前端消费者进行排序,因为出于隐私原因,不返回实际时间戳

但是,一些实际时间戳(标记为可见)将返回到前端。因此,如果可以为不可见的时间戳计算此静态偏移量,则不能使用线性函数。

一些限制条件:

  • 需要为每个时间戳执行解决方案(我们不能事先对时间戳进行分组)
  • 我认为线性函数是不可能的,因为有时我们也传递真实的时间戳,在前端使用时间戳和f(时间戳)可以很容易地计算偏移量
请你给我指出一个可行的算法/解决方案好吗


提前感谢。

我建议您在服务器端订购条目,并向前端发送“临时索引”。严格地说,这个算法不是散列函数,因为输出取决于所有输入项,而不仅仅是一个,但在您的用例中应该可以。从隐私角度来看,这是最好、最简单的解决方案。任何其他函数都会泄漏超出需要的信息。所有单调函数都可以使用二进制搜索进行反转,因此它们并不真正满足哈希函数的要求,至少在加密意义上是如此。

仅针对那些好奇的人:我烘焙了一个随机单调函数用于非加密目的,只是为了让我们能看到,我期望这样一个函数的情节会是什么样子。我仍然不建议在OP的订购任务中使用它,但它让我认为这些需求毕竟是有意义的

  • 使用的单调函数应该是秘密的(我的意思是它应该是一个密钥加密函数,密钥在服务器上隐藏和保护)
  • 必须仔细编写服务器,不要提供将时间戳转换为“哈希”的oracle。这样的甲骨文可以从散列中获得时间戳
const N=1000000000n;
常数SEED=0x2545F4914F6CDD1Dn;
常数RES=200;
函数main(){
设ctx=mycanvas.getContext(“2d”);
ctx.moveTo(0,0);
for(设xs=0;xs27n;
返回x&0xffffffffffffn;
}
main();

“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
——这就是我们将看到另一个“Y2K”的原因2038年的错误,因为仍然有代码在32位值中以秒的形式存储自历元以来的时间。是否可以在要散列的数据中放入一个序列号,然后使用散列值的一个子集来存储该序列号?可能需要额外的工作来确保剩余的“散列”bits仍然是一个性能良好的哈希函数。几年前,我们研究了是否可以在端到端加密文件存储解决方案中添加一些服务器端搜索功能。这个问题与您的问题类似,在不知道您正在处理的实际数据的情况下进行有意义的计算。唯一的“真正的”我所知道的解决方案是使用同态加密,但到目前为止,它仍然不可行。编辑:在您的情况下,即使同态加密也不起作用,因为知道有序列表本身是泄漏信息的问题。我无法在服务器端对条目进行排序,因为我有不同的后端。一些后端正在推t他将信息作为推送通知发送到前端。这意味着所需的机制应该由每个注册中心独立运行。
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"