Java 如何在Android应用程序中为金融交易生成最多10个字符的唯一参考ID?
我想为Android应用程序的特定用户在特定时间完成的事务创建一个唯一密钥。我读过两种方法:Java 如何在Android应用程序中为金融交易生成最多10个字符的唯一参考ID?,java,android,database,key,uuid,Java,Android,Database,Key,Uuid,我想为Android应用程序的特定用户在特定时间完成的事务创建一个唯一密钥。我读过两种方法: 将当前时间戳与用户id或用户设备id连接 使用Java的UUID类为每个事务生成唯一的字符串 我对这些方法的结果字符串有几点担心: 第一种方法的结果可能太明显,用户无法猜测和访问其他人的事务 这两种方法的结果似乎太长,无法与用户通信 有人知道更好的方法吗?你可以用。易于计算,代码空间约为2^40。如果您连接到ISBNs,则可以达到2^80以上的代码空间。在应用程序和服务器(机器与机器对话)之间进行交易时
有人知道更好的方法吗?你可以用。易于计算,代码空间约为2^40。如果您连接到ISBNs,则可以达到2^80以上的代码空间。在应用程序和服务器(机器与机器对话)之间进行交易时,使用您建议的作为交易标识符。29个字符对于一个事务密钥来说并不算多,特别是对于智能手机现在拥有的那种连接 我会对这些值加盐,只是为了增加一点混淆。 之后,对于需要从/发送给人类的事务ID,您将需要更小的(更容易容忍和人类可读)。我会使用更小的ID(可能会发生冲突),但只能让它们在一定时间内工作 更多信息请参见我的评论
希望我能帮忙 为什么它们太长了?你的最大尺码是多少?我会简单地在ASCII表上随机排列,使用时间戳和用户ID连接来为结果播种。嗨,Robin,用户密钥是一个16位长的数字,时间戳再加上13位。保存(在服务器上)和通信(给用户)如此长的事务参考号将是一件痛苦的事,对吗?不完全是,我们谈论的是几个字节。在任何情况下,如果你想缩短它,你可以使用任何你想要的规则。例如,您可以使用时间戳的最后5位数字和用户标识上每两位数字中的一位。此外,您可以按照指定的方式创建密钥,然后对其进行salt和hash(或任何确定性的操作),使其更小。我可以从时间戳中删除毫秒,但如果我使用其他数字,是否会导致冲突?我不太熟悉散列,但是通过散列减少密钥长度是否也会留下密钥冲突的机会?因为无论使用何种格式,密钥越长,冲突的可能性越小。因此,缩短密钥时,会增加碰撞的机会。我不打算讨论这背后的数学问题,但总的来说,如果你想把熵水平降低,你应该尽可能使用最大的键。我宁愿发送一个碰撞几率很小的大钥匙,也不愿发送一个碰撞几率很大的小钥匙。你能澄清一下ISBN13在我的情况下是如何工作的吗?谢谢非常感谢你,罗宾!对于面向用户的id,如果只使用一个简单的id为给定用户唯一地标识一个事务,而不是全局唯一的事务,那会怎么样?实际上,我认为您会失去这方面的安全性。生成一个新的TransactionId(long),然后对其大小或可读性进行散列,怎么样?然后,您可以确保它只在一段时间内有效,以恢复该安全性(您通过散列丢失了该安全性)。这都是非常近似的,取决于很多因素。