Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 UUID缩短_Java_Redis_Uuid - Fatal编程技术网

Java UUID缩短

Java UUID缩短,java,redis,uuid,Java,Redis,Uuid,我需要计算一个应用程序的每日唯一用户数 我唯一能够唯一识别用户的方法是通过他们的UUID(这是外部提供的,所以我不得不使用它) 我知道我每天的用户数是几百万 我想在Redis中使用一个位集来进行人口统计,但为了让它起作用,我需要一种缩小UUID的方法,这样它就可以轻松地适应一个较长的时间。我知道碰撞的可能性,但我不关心精确的数字 以前有人在Java中这样做过吗?我所追求的是如何将我的UUID转换成适合长时间使用的东西。在对象上有两种方法可能会让您受益 和。两者都返回了一个长时间。以其中一个lon

我需要计算一个应用程序的每日唯一用户数

我唯一能够唯一识别用户的方法是通过他们的UUID(这是外部提供的,所以我不得不使用它)

我知道我每天的用户数是几百万

我想在Redis中使用一个位集来进行人口统计,但为了让它起作用,我需要一种缩小UUID的方法,这样它就可以轻松地适应一个较长的时间。我知道碰撞的可能性,但我不关心精确的数字


以前有人在Java中这样做过吗?我所追求的是如何将我的UUID转换成适合长时间使用的东西。

在对象上有两种方法可能会让您受益


和。两者都返回了一个长时间。以其中一个long作为答案(如果您愿意的话,也可以是某种组合)。

这可能足够小,可以直接使用完整的UUID作为散列键。如果适合您的需要,也可以使用近似值。

您可以生成生成整数或长整数的UUID哈希,并将其用于人口计数

看看绝地redis库中的'redis.clients.util.Murrushash'。你可以在

*编辑:样本

        UUID uuid = UUID.randomUUID();
        ByteBuffer buf = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits());
        buf.flip();
        int useMe= MurmurHash.hash(buf, 123);

如果您使用内置Java版本,将时间放在一个值中,节点和时钟序列放在另一个值中,我会使用
^
(xor)或类似的方法组合这两个值。感谢您的建议,不幸的是,我发现了从getLeastSignificantBits()和getMostSignificantBits()返回的长时间仍然太大,无法在Redis位集中使用。从其中一个位集中获取输出,并将其屏蔽以减少位数。允许多少位?谢谢,乔纳斯。我假设使用类似杂音杂音的东西有碰撞的风险(可能很低?)?我注意到在您的示例中,您将种子值设置为123。这是一个适合散列UUID的值吗?嗨,种子头,很抱歉回答得太晚了,但这里是这样的:每个散列算法都有冲突的风险,但是由于您正在进行人口计数,您应该没事。redis库使用“0x1234ABCD”作为种子,这应该可以