我有一个带有String的对象,该对象具有唯一的id。(例如“ ocx7gf”或“ 67hfs8”),我需要为其提供int
hascode()的实现,该实现显然是唯一的。
如何以最简单/最快的方式将字符串转换为唯一的int?
10倍
编辑-确定。我已经知道String.hashcode是可能的。但是不建议在任何地方使用。实际上’,如果不建议使用其他任何方法-
如果我的对象在集合中并且需要哈希码,则应该使用还是不使用它。我应该将其连接到另一个字符串以使其更成功吗?
不,你 没有 需要有一个实现,它返回一个独特的价值,“明明”,因为很明显多数的实现将被打破。
您想要做的是在各个位之间有良好的分布,尤其是对于公用值(如果有任何值比其他值更常见)。除非对格式有特殊的了解,否则最好只使用字符串本身的哈希码。
通过对id格式限制的特殊了解,可以进行自定义并获得更好的性能,尽管错误的假设更可能使情况变得更糟。
编辑:对位的良好传播。
如此处和其他答案所述,完全唯一是不可能的,并且哈希冲突是可能的。使用散列的方法知道这一点并可以对其进行处理,但是它 确实
影响性能,因此我们希望冲突很少发生。
此外,哈希通常会重新哈希,因此我们的32位数字最终可能会减少到例如0到22范围内的1,并且我们希望在该范围内具有尽可能好的分布。
我们还希望通过不花太多时间来计算哈希来平衡这一点,以至于哈希本身就成为了瓶颈。不完美的平衡行为。
不良哈希方法的一个经典示例是针对X,Y整数的坐标对执行以下操作:
return X ^ Y;
尽管这样做非常好,可以从4 ^ 32个可能的输入中返回2 ^ 32个可能的值,但在现实世界中,使用X和Y等于({0,0},{1
,1},{2,2}等)都将散列为零,或者匹配对({2,3}和{3,2})将散列为相同的数字。我们可能会通过以下方式更好地为我们服务:
return ((X << 16) | (x >> 16)) ^ Y;
现在,与前者相比,存在 着 许多令人恐惧的可能值,但在实际情况下它往往会更好。
当然,如果您正在编写通用类(不知道有什么可能的输入)或对手头的目的有更好的了解,则还有另一项工作。例如,如果我使用的是Date对象,但知道它们都只是日期(时间部分始终为午夜)并且彼此之间的间隔只有几年,那么我可能更喜欢只使用日,月和年的低位数,超过标准的一位。的作家Date
,虽然不能在这样的知识工作,并尽量满足大家。
因此,例如,如果我知道给定的字符串将始终由[az]或[0-9]范围内的6个不区分大小写的字符组成(您的情况似乎如此,但是从您的问题尚不清楚然后,我可能会使用一种算法,为每个字符分配一个0到35(每个字符36个可能的值)的值,然后遍历字符串,每次将当前值乘以36并加上下一个字符。
假设id分布良好,这就是方法,特别是如果我按以下顺序排列,即哈希中的低位数字与id中最频繁更改的char匹配(如果可以进行这样的调用)
,因此可以很好地将重新哈希处理到较小的范围内。
但是,由于肯定缺乏这种格式的知识,因此我无法确定地进行该调用,并且可能会使情况变得更糟(算法变慢,散列质量几乎没有甚至出现负增长)。
您拥有的一个优点是,由于它本身就是一个ID,因此大概没有其他不相等的对象具有相同的ID,因此不需要检查其他属性。这并不总是成立。
问题内容: 如何使用数字和字母生成一个随机的,唯一的字符串以用于验证链接?就像您在网站上创建帐户一样,该帐户会向您发送一封包含链接的电子邮件,您必须单击该链接才能验证您的帐户…是的…其中之一。 如何使用PHP生成其中之一? 更新: 刚刚记得。这是一个PHP函数,可根据当前时间(以微秒为单位)生成唯一标识符。我想我会用的。 问题答案: 如果您不需要它随着时间的流逝而变得绝对独特,请执行以下操作: 否
问题内容: 我正在使用MySql 5.5.37。我有一个包含以下各列的表格 代码列是唯一的,我的ID列是GUID。根据上表中的某些条件,我有许多行想要更新(例如WHERE COLUMN1 = 0)。如何为我的CODE列生成随机的,唯一的6个字符的代码(最好是字母和数字),以使其不违反表中的唯一约束?请注意,表中不符合条件的列(例如COLUMN1 <> 0的位置)已经具有CODE列的唯一值。 编辑:
问题 你想随机生成一个唯一的标识符。 解决方案 可以根据一个随机数值生成一个 Base 36 编码的字符串。 uniqueId = (length=8) -> id = "" id += Math.random().toString(36).substr(2) while id.length < length id.substr 0, length uniqueId() # =
假设我有一个长度为8个字节的字符串,每个字节都是一个字符,来自以下范围:0-9,a-z,A-Z,总共62个变量。这个字符串的排列总数是62的8次方= 218340105584896。我需要编写一个函数,该函数将接受0-218340105584896范围内的数字,并返回唯一的字符串。在“唯一”下,我的意思是该函数不能为该范围内的两个不同数字返回相同的字符串。任何代码示例和提示将不胜感激。
我想了解一下如何从java对象集合中生成唯一的id(字符串/数字等),这些对象可以是各种数据类型,如String、BigDecimal、org。乔达。时间本地日期或组织。乔达。时间LocalDateTime或任何自定义java对象。 生成的id应该基于java对象中的值,以便为具有相同值的两个集合生成相同的id。类似于sql group by子句的内容。我想从group by(col1、col2、
问题内容: 如何使用数据库查询回调设置变量值?我该怎么办? 问题答案: 自从使用node.js已经有一段时间了,但是我想我可以提供帮助。 首先,在node中,您只有一个线程,应该使用回调。您的代码将发生的情况是查询将排队等待执行,但是循环将毫无意义地连续作为繁忙循环运行。 您应该可以通过以下回调来解决您的问题: 并这样使用 我在大约2年内没有编写任何node / js的代码,也没有进行测试,但是基