Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IdUtil.getDataCenterId(Long.MAX_VALUE) 偶尔会出现小于等于1的 dataCenterId #2101

Closed
wangliang181230 opened this issue Jan 17, 2022 · 13 comments

Comments

@wangliang181230
Copy link
Contributor

wangliang181230 commented Jan 17, 2022

测试不通过日志:

[INFO] Running cn.hutool.core.util.IdUtilTest
Error:  Tests run: 8, Failures: 1, Errors: 0, Skipped: 3, Time elapsed: 0.088 s <<< FAILURE! - in cn.hutool.core.util.IdUtilTest
Error:  getDataCenterIdTest  Time elapsed: 0.012 s  <<< FAILURE!
java.lang.AssertionError
	at cn.hutool.core.util.IdUtilTest.getDataCenterIdTest(IdUtilTest.java:141)

IdUtilTest 测试用例源码:

@Test
public void getDataCenterIdTest(){
	final long dataCenterId = IdUtil.getDataCenterId(Long.MAX_VALUE);
	Assert.assertTrue(dataCenterId > 1);
}
@wangliang181230 wangliang181230 changed the title IdUtil.getDataCenterId(Long.MAX_VALUE) 偶尔会出现不是正数的 dataCenterId IdUtil.getDataCenterId(Long.MAX_VALUE) 偶尔会出现小于等于1的 dataCenterId Jan 17, 2022
@CherryRum
Copy link
Collaborator

麻烦您看下您的ip地址获取正确吗?
我这边测试100次也没有出现异常

@wangliang181230
Copy link
Contributor Author

wangliang181230 commented Jan 17, 2022

麻烦您看下您的ip地址获取正确吗? 我这边测试100次也没有出现异常

@CherryRum
我这边运行过几百多次,也是第一次出现。
我这边暂时改了一下测试用例的代码,等复现后,我再把相关原因发出来吧。

@CherryRum
Copy link
Collaborator

好的 这玩意获取的mac地址,所以每个人的都不太好测试

@wangliang181230
Copy link
Contributor Author

wangliang181230 commented Jan 17, 2022

我也是扔到 github/actions 上在自动测的,所以也不是我的本地环境。
我重新运行了一次 对应的测试任务,结果又成功的。
等我多试几次看看再说吧。

@CherryRum
Copy link
Collaborator

我猜测是 容器的问题

@CherryRum
Copy link
Collaborator

我大概看了下算法 确实和我之前背的有一点点偏差

@wangliang181230
Copy link
Contributor Author

wangliang181230 commented Jan 17, 2022

[INFO] Running cn.hutool.core.util.IdUtilTest
Error:  Tests run: 8, Failures: 1, Errors: 0, Skipped: 3, Time elapsed: 0.026 s <<< FAILURE! - in cn.hutool.core.util.IdUtilTest
Error:  getDataCenterIdTest  Time elapsed: 0.01 s  <<< FAILURE!
java.lang.AssertionError: 校验 'dataCenterId > 1' 不通过:dataCenterId = 1, host = /172.17.0.1, mac = [2,66,87,25,123,0]
	at cn.hutool.core.util.IdUtilTest.getDataCenterIdTest(IdUtilTest.java:156)

调整后的测试用例源码:

@Test
public void getDataCenterIdTest(){
	//final long dataCenterId = IdUtil.getDataCenterId(Long.MAX_VALUE);
	//Assert.assertTrue(dataCenterId > 1);

	long dataCenterId = 1L;
	InetAddress host = NetUtil.getLocalhost();
	final byte[] mac = NetUtil.getHardwareAddress(host);
	if (null != mac) {
		dataCenterId = ((0x000000FF & (long) mac[mac.length - 2])
				| (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6;
		dataCenterId = dataCenterId % (Long.MAX_VALUE + 1);
	}

	System.out.println("dataCenterId = " + dataCenterId + ", host = " + host + ", mac = " + toString(mac));

	Assert.assertTrue("校验 'dataCenterId > 1' 不通过:dataCenterId = " + dataCenterId + ", host = " + host + ", mac = " + toString(mac), dataCenterId > 1);
}

@wangliang181230
Copy link
Contributor Author

wangliang181230 commented Jan 17, 2022

我大概看了下算法 确实和我之前背的有一点点偏差

又复现出来了。
我是直接把方法里面的代码拿出来了。主要是想看下mac是不是为null。
结果,dataCenterId是0,mac不为null。

@CherryRum
Copy link
Collaborator

您试试这个

 id = ((0x000000FF & (long) mac[mac.length - 1])
                        | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;

@wangliang181230
Copy link
Contributor Author

wangliang181230 commented Jan 17, 2022

您试试这个

 id = ((0x000000FF & (long) mac[mac.length - 1])
                        | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;

不行,返回0了。

@CherryRum
Copy link
Collaborator

我大概知道了,看了下 代码确实有点问题,下个版本应该会有修正

@wangliang181230
Copy link
Contributor Author

我大概知道了,看了下 代码确实有点问题,下个版本应该会有修正

好的。

@looly
Copy link
Member

looly commented Jan 20, 2022

5.7.20做一些修改,允许返回0。

见:#2105

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants