UUID缩短

4

我需要计算应用程序每天的独立用户数。

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

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

我想使用Redis中的位图来进行人口统计,但是为了使其工作,我需要一种将我的UUID缩小到可以适应long类型的方法。我意识到可能会存在碰撞的风险,但我并不担心精确的数字。

有人在Java中做过这个吗?我想知道如何将我的UUID转换为可以适应long类型的内容。

3个回答

3
你可以生成一个哈希值,将你的uuid转换为整数或长整数,并将其用于人口统计。请查看jedis redis库中的`redis.clients.util.MurmurHash'。你可以在https://github.com/xetorthio/jedis找到它。
*编辑:示例
        UUID uuid = UUID.randomUUID();
        ByteBuffer buf = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits());
        buf.flip();
        int useMe= MurmurHash.hash(buf, 123);

谢谢 Jonas。我假设像 MurmurHash 这样的东西有冲突的风险(可能很低?)?我注意到在你的例子中,你把种子值设为了 123。对于哈希 UUID 来说,这是一个合适的值吗? - seedhead
嗨seedhead,抱歉回答晚了,但是这里是答案:每个哈希算法都有碰撞的风险,但由于你正在进行人口统计,所以应该没问题。 Redis库使用'0x1234ABCD'作为种子,这应该没问题。 - Jonas Adler

3

4
如果你正在使用内置的Java版本,将时间放在一个值中,将节点和时钟序列放在另一个值中,我建议使用^(异或)或类似的方式将这两个值结合起来。 - David Harkness
谢谢您的建议,不幸的是我发现从getLeastSignificantBits()和getMostSignificantBits()返回的长整型值仍然太大,无法在Redis位集中使用。 - seedhead
从其中一个输出结果并进行屏蔽以减少位数。你可以使用多少个位? - Starkey

2

这可能足够小,可以直接使用完整的UUID作为哈希键。如果适合您的需求,也可以使用更少的内存进行近似计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接