在 Scala 中生成随机十六进制?
Generate Random Hexidecimal in Scala?
如何在 Scala 中生成随机十六进制数?
它的目的主要是将其用作 UDF,以在 DataFrame 中每列生成随机的 64 个十六进制字符。
我知道可以利用下面的 Int 等:
val r = scala.util.Random
println(r.nextInt)
十六进制是否有等效或其他简单方法?特别是 64 个字符?例如)6e89f0c4c8a86812ef594229e5f4d997cb38aadc8a694f1b3be24a543b7699de
由于 Byte
是 2 个十六进制数字,因此可以生成 32 个随机字节的数组,将它们呈现为十六进制,然后将它们连接成一个字符串:
def randomHex256(): String = {
val arr = Array[Byte](32)
scala.util.Random.nextBytes(arr)
// iterator avoids creating a strict intermediate collection
arr.iterator.map(b => String.format("%02x", Byte.box(b))).mkString("")
}
下面是 base64 的示例代码(Scala),其中十六进制生成的概念相似,区别如下所述:
base64 的开销较小(base64 每 3 个字节的原始数据产生 4 个字符,而 hex 为每个原始数据的字节产生 2 个字符)。
import java.util.Base64
def encodeToBase64String(bytes: Array[Byte]): String = Base64.getEncoder.encodeToString(bytes)
val dm_with_clsr_two =(inputString:String) => encodeToBase64String(inputString.getBytes("UTF-8"))
spark.udf.register("DATA_MASK_TWO", dm_with_clsr_two)
spark.sql("select id,DATA_MASK_TWO(id), gender, birthdate, maiden_name, lname, fname, address, city, state, zip, cc_number, DATA_MASK_TWO(cc_number), cc_cvc, cc_expiredate from sample_ssn_data").show(5,false)
+-----------+--------------------------------+------+----------+-----------+------+--------+--------------------+-----------+-----+-----+-------------------+--------------------------------+------+-------------+
|id |UDF:DATA_MASK_ONE(id) |gender|birthdate |maiden_name|lname |fname |address |city |state|zip |cc_number |UDF:DATA_MASK_TWO(cc_number) |cc_cvc|cc_expiredate|
+-----------+--------------------------------+------+----------+-----------+------+--------+--------------------+-----------+-----+-----+-------------------+--------------------------------+------+-------------+
|2022-25-005|4DDA8A5D35947B12B948EFF6EF14579A|m |1958/04/21|Smooth |White |John |10932 California Rd |Calfornia creek |CA|94025|5270 2020 2022 5516|4F88DDF6489891710B9C5A5D8412129E|123 |2010/06/25 |
如何在 Scala 中生成随机十六进制数?
它的目的主要是将其用作 UDF,以在 DataFrame 中每列生成随机的 64 个十六进制字符。
我知道可以利用下面的 Int 等:
val r = scala.util.Random
println(r.nextInt)
十六进制是否有等效或其他简单方法?特别是 64 个字符?例如)6e89f0c4c8a86812ef594229e5f4d997cb38aadc8a694f1b3be24a543b7699de
由于 Byte
是 2 个十六进制数字,因此可以生成 32 个随机字节的数组,将它们呈现为十六进制,然后将它们连接成一个字符串:
def randomHex256(): String = {
val arr = Array[Byte](32)
scala.util.Random.nextBytes(arr)
// iterator avoids creating a strict intermediate collection
arr.iterator.map(b => String.format("%02x", Byte.box(b))).mkString("")
}
下面是 base64 的示例代码(Scala),其中十六进制生成的概念相似,区别如下所述:
base64 的开销较小(base64 每 3 个字节的原始数据产生 4 个字符,而 hex 为每个原始数据的字节产生 2 个字符)。
import java.util.Base64
def encodeToBase64String(bytes: Array[Byte]): String = Base64.getEncoder.encodeToString(bytes)
val dm_with_clsr_two =(inputString:String) => encodeToBase64String(inputString.getBytes("UTF-8"))
spark.udf.register("DATA_MASK_TWO", dm_with_clsr_two)
spark.sql("select id,DATA_MASK_TWO(id), gender, birthdate, maiden_name, lname, fname, address, city, state, zip, cc_number, DATA_MASK_TWO(cc_number), cc_cvc, cc_expiredate from sample_ssn_data").show(5,false)
+-----------+--------------------------------+------+----------+-----------+------+--------+--------------------+-----------+-----+-----+-------------------+--------------------------------+------+-------------+
|id |UDF:DATA_MASK_ONE(id) |gender|birthdate |maiden_name|lname |fname |address |city |state|zip |cc_number |UDF:DATA_MASK_TWO(cc_number) |cc_cvc|cc_expiredate|
+-----------+--------------------------------+------+----------+-----------+------+--------+--------------------+-----------+-----+-----+-------------------+--------------------------------+------+-------------+
|2022-25-005|4DDA8A5D35947B12B948EFF6EF14579A|m |1958/04/21|Smooth |White |John |10932 California Rd |Calfornia creek |CA|94025|5270 2020 2022 5516|4F88DDF6489891710B9C5A5D8412129E|123 |2010/06/25 |