gpt4 book ai didi

java - 如何以随机方式删除java中的出生日期,这会导致当我提供相同的原始出生日期时生成相同的随机数

转载 作者:行者123 更新时间:2023-11-30 05:27:17 25 4
gpt4 key购买 nike

我正在尝试进行数据清理,即尝试清理出生日期字段,但我希望它在某种程度上保持一致,即为相同的输入日期生成相同的随机数或出生日期。请帮助我解决这个问题。

我尝试过这个随机生成代码,但即使我提供相同的输入,它也会生成不同的代码。我希望随机输出保持一致。

import java.util.GregorianCalendar;

public class RandomDateOfBirth {

public static void main(String[] args) {
GregorianCalendar gc = new GregorianCalendar();
int year = randBetween(1900, 2010);
gc.set(gc.YEAR, year);
int dayOfYear = randBetween(1, gc.getActualMaximum(gc.DAY_OF_YEAR));
gc.set(gc.DAY_OF_YEAR, dayOfYear);
System.out.println(gc.get(gc.YEAR) + "-" + (gc.get(gc.MONTH) + 1) + "-" + gc.get(gc.DAY_OF_MONTH));
}

public static int randBetween(int start, int end) {
return start + (int) Math.round(Math.random() * (end - start));
}

}

最佳答案

请注意:如果您用可重复确定的值替换敏感数据,那么您并没有真正清理数据。如果您的目的是保护敏感数据,例如HIPAA ,我建议你咨询一下负责人。他们应该接受如何适当清理数据的培训。

还有一点需要澄清:你的标题是缩写。根据定义,随机值不能以可预测的方式重复。

java.time

您的代码示例使用了糟糕的日期时间类,这些类在几年前已被 JSR 310 中定义的现代 java.time 类取代。对于仅日期值,请使用 LocalDate 类。

只需指定任意天数

如果您想要任意但可重复的调整,只需添加或减去一定的天数即可。您可以任意为日数为奇数的日期指定一个负数(减法),并为日数为偶数的日期指定一个正数(加法)。

要确定偶数或奇数,请参阅 this Question .

int daysToAddToOddDayNumber = -2_555 ;
int daysToAddToEvenDayNumber = 2_101 ;

LocalDate localDate = LocalDate.of( 1970 , Month.JANUARY , 1 );
boolean isEven = ( ( localDate.getDayOfMonth() & 1) == 0 ) ;
LocalDate adjusted = isEven ? localDate.plusDays( daysToAddToEvenDayNumber ) : localDate.plusDays( daysToAddToOddDayNumber ) ;

转储到控制台。

System.out.println( "localDate.toString(): " + localDate ) ;
System.out.println( "adjusted.toString(): " + adjusted ) ;

查看此code run live at IdeOne.com.

localDate.toString(): 1970-01-01

adjusted.toString(): 1963-01-03

隐藏要添加的天数

您可以通过对日期值进行哈希计算,然后使用该哈希结果来确定要添加的天数。同样,正如我之前所说,根据项目的需求(和法律!),这可能不符合充分的清理条件。

LocalDate localDate = LocalDate.of( 1970 , Month.JANUARY , 1 );
String input = localDate.toString();

MessageDigest md = null;
try
{
md = MessageDigest.getInstance( "MD5" );
md.update( input.getBytes() );
byte[] digest = md.digest();
int days = new BigInteger( 1 , digest ).mod( new BigInteger( "10000" ) ).intValue();
LocalDate adjusted = localDate.minusDays( days );

System.out.println( "localDate = " + localDate );
System.out.println( "input = " + input );
System.out.println( "days = " + days );
System.out.println( "adjusted = " + adjusted );
} catch ( NoSuchAlgorithmException e )
{
e.printStackTrace();
}

查看此code run live at IdeOne.com.

localDate = 1970-01-01

input = 1970-01-01

days = 8491

adjusted2 = 1946-10-03

关于java - 如何以随机方式删除java中的出生日期,这会导致当我提供相同的原始出生日期时生成相同的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58277067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com