Symbol addConstantMemberReference(
            final int tag, final String owner, final String name, final String descriptor) {
//    int hashCode = hash(tag, owner, name, descriptor);
        int hashCode = 0x7FFFFFFF & (tag + owner.hashCode() * name.hashCode() * descriptor.hashCode());
        Symbol entry = entries[hashCode % entries.length];
        while (entry != null) {
            if (entry.tag == tag
                    && entry.hashCode == hashCode
                    && entry.owner.equals(owner)
                    && entry.name.equals(name)
                    && entry.value.equals(descriptor)) {
                return entry;
            }
            entry = entry.next;
        }
        constantPool.put122(
                tag, addConstantUtf8Reference(/*CONSTANT_CLASS_TAG*/ 7, owner).index, addConstantNameAndType(name, descriptor));
        return put(new Symbol(constantPoolCount++, tag, owner, name, descriptor, 0, hashCode));
    }
//     * Adds a CONSTANT_Methodref_info or CONSTANT_InterfaceMethodref_info to the constant pool of this
//     * symbol table. Does nothing if the constant pool already contains a similar item.
//     *
//     * @param owner       the internal name of a class.
//     * @param name        a method name.
//     * @param descriptor  a method descriptor.
//     * @param isInterface whether owner is an interface or not.
//     * @return a new or already existing Symbol with the given value.
//
core/src/main/java/com/alibaba/fastjson2/internal/asm/SymbolTable.java