kotlin 从对象的ArrayList生成hashCode

mbskvtky  于 2023-03-19  发布在  Kotlin
关注(0)|答案(1)|浏览(208)

我尝试从对象的ArrayList生成哈希代码,该代码在多次执行时保持一致。我尝试执行ArrayList.hashCode(),但每次执行都返回不同的值(因为它创建内存地址的哈希)。我还尝试了MD5哈希,但无法将其转换为byteArray
我正在寻找一种可靠且一致的散列方法,而不是迭代地从ArrayList中提取字符串。
下面是数组列表的外观

[[[ObjectClass1, ObjectClass1], ObjectClass2]]

data class class1(
        val a: String,
        val b: String,
        val c: Int,
        val d: class3,
        val e: Boolean
)

data class class3(val a: Set<String>)

enum class class2 { HI, BYE }

下面是我的代码:

class Hasher() {
    companion object {
        private lateinit var toBeHashed

        override fun equals(other: Any?): Boolean {
            return super.equals(other)
        }
        override fun hashCode(): Int {
            // create hash here
            toBeHashed.hashCode()
        }
        fun createHash(arrayList) {
            toBeHashed = arrayList
            val hash = hashCode()
            return hash
        }
    }
}

Hasher.createHash(arrayList)
pgky5nke

pgky5nke1#

Enum.hashcode是final的,所以没有枚举类可以覆盖它。如果你的实现以一种执行不一致的方式实现它,那么你对此无能为力。
唯一的方法是编写自己的散列代码算法。例如,

fun Enum<*>.consistentHashcode() = 
    this.javaClass.enumConstants.indexOf(this)
    // or name.hashCode()

// you need to write this for the whole list, because ArrayList.hashcode
// calls the built-in hashcode.
fun List<*>.enumConsistentHashcode(): Int {
    var hashCode = 1
    for (i in indices) {
        val e = this[i]
        val eHashCode = when (e) {
            is Enum<*> -> e.consistentHashcode()
            is List<*> -> e.enumConsistentHashcode()
            else -> e.hashCode()
        }
        hashCode = 31 * hashCode + eHashCode
    }
    return hashCode
}

相关问题